diff --git a/rust/Cargo.lock b/rust/Cargo.lock index a6caca7..25fa754 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -25,102 +25,1143 @@ dependencies = [ "memchr", ] +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "anstream" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "anstyle-parse" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys", +] + [[package]] name = "anyhow" version = "1.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" + +[[package]] +name = "arc-swap" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a3a1fd6f75306b68087b831f025c712524bcb19aad54e557b1129cfa0a2b207" +dependencies = [ + "rustversion", +] + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" + +[[package]] +name = "bitmaps" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "031043d04099746d8db04daf1fa424b2bc8bd69d92b25962dcde24da39ab64a2" +dependencies = [ + "typenum", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "cc" +version = "1.2.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e228eec9be7c17ccb640b59b36a5cd805ea2a564a4c5e162c2f659fea30d3b96" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "chrono" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" +dependencies = [ + "num-traits", +] + +[[package]] +name = "clap" +version = "4.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "clap_lex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" + +[[package]] +name = "colorchoice" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crossbeam" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-epoch", + "crossbeam-queue", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "csv" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52cd9d68cf7efc6ddfaaee42e7288d3a99d613d4b50f76ce9827ae0c6e14f938" +dependencies = [ + "csv-core", + "itoa", + "ryu", + "serde_core", +] + +[[package]] +name = "csv-core" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "704a3c26996a80471189265814dbc2c257598b96b8a7feae2d31ace646bb9782" +dependencies = [ + "memchr", +] + +[[package]] +name = "dashmap" +version = "6.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6361d5c062261c78a176addb82d4c821ae42bed6089de0e12603cd25de2059c" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "defmt" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6e524506490a1953d237cb87b1cfc1e46f88c18f10a22dfe0f507dc6bfc7f7f" +dependencies = [ + "bitflags 1.3.2", + "defmt-macros", +] + +[[package]] +name = "defmt-macros" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0a27770e9c8f719a79d8b638281f4d828f77d8fd61e0bd94451b9b85e576a0b" +dependencies = [ + "defmt-parser", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "defmt-parser" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e" +dependencies = [ + "thiserror", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dot-generator" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0aaac7ada45f71873ebce336491d1c1bc4a7c8042c7cea978168ad59e805b871" +dependencies = [ + "dot-structures", +] + +[[package]] +name = "dot-structures" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "498cfcded997a93eb31edd639361fa33fd229a8784e953b37d71035fe3890b7b" + +[[package]] +name = "du_utils_slist" +version = "0.1.0" +source = "git+https://github.com/belovdv/du_utils.git?rev=7813f1156c67ceb806682e18a61ce805982388a7#7813f1156c67ceb806682e18a61ce805982388a7" +dependencies = [ + "du_utils_slist_macro", +] + +[[package]] +name = "du_utils_slist_macro" +version = "0.1.0" +source = "git+https://github.com/belovdv/du_utils.git?rev=7813f1156c67ceb806682e18a61ce805982388a7#7813f1156c67ceb806682e18a61ce805982388a7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "egglog" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2e053dcef2cd92b0dee0acfad08d83a98c1c1e55b4c55b8eefa2c0e3f4d055" +dependencies = [ + "chrono", + "clap", + "csv", + "dyn-clone", + "egglog-add-primitive", + "egglog-ast", + "egglog-bridge", + "egglog-core-relations", + "egglog-numeric-id", + "egglog-reports", + "egraph-serialize", + "env_logger", + "hashbrown 0.16.1", + "im-rc", + "indexmap 2.14.0", + "log", + "mimalloc", + "num", + "ordered-float", + "rayon", + "rustc-hash", + "serde_json", + "thiserror", + "web-time", +] + +[[package]] +name = "egglog-add-primitive" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eea7ffb4d889c382918cfa139256f2a4d3f46de6e08d9c071e33543393bd3663" +dependencies = [ + "quote", + "syn 2.0.118", +] + +[[package]] +name = "egglog-ast" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c67f2aa84cdabd48b266cff0ad4bc6d4cb4386ca51d8c8d93e089f182bc162b" +dependencies = [ + "ordered-float", +] + +[[package]] +name = "egglog-bridge" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aaf9e5c5f59f5edb456367dd1e7e30fe5ecfd5b434954ec7ad2d90b3169d9a2f" +dependencies = [ + "anyhow", + "dyn-clone", + "egglog-core-relations", + "egglog-numeric-id", + "egglog-reports", + "egglog-union-find", + "hashbrown 0.16.1", + "indexmap 2.14.0", + "log", + "num-rational", + "once_cell", + "ordered-float", + "petgraph", + "rayon", + "smallvec", + "thiserror", + "web-time", +] + +[[package]] +name = "egglog-concurrency" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5cf71f21545d7b14aceb21e51fdc16b1077e5063df03d57253fc13f098ea2cd" +dependencies = [ + "arc-swap", + "egglog-numeric-id", + "rayon", + "smallvec", +] + +[[package]] +name = "egglog-core-relations" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7d477debbbe77c0fb24df98c37560cce6b8dcd8d05918a009926204cbf13c73" +dependencies = [ + "anyhow", + "bumpalo", + "crossbeam", + "crossbeam-queue", + "dashmap", + "dyn-clone", + "egglog-concurrency", + "egglog-numeric-id", + "egglog-reports", + "egglog-union-find", + "fixedbitset", + "hashbrown 0.16.1", + "indexmap 2.14.0", + "log", + "num", + "once_cell", + "petgraph", + "rand 0.9.4", + "rayon", + "rustc-hash", + "smallvec", + "thiserror", + "web-time", +] + +[[package]] +name = "egglog-numeric-id" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b207a4ee3241bc8c84bb314d8c6802fa4974c4742a9b1af5e7646ec6ddb5ae5" +dependencies = [ + "rayon", +] + +[[package]] +name = "egglog-reports" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03a58e0caea9c3d0fe0486245784f579645576f3b4a8be97fb5828655b281208" +dependencies = [ + "clap", + "hashbrown 0.16.1", + "indexmap 2.14.0", + "rustc-hash", + "serde", + "serde_json", + "web-time", +] + +[[package]] +name = "egglog-union-find" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175f8e99129dcdac7f96b12cc4703c4145bb74a1a53accc46073a19ace10b9f9" +dependencies = [ + "crossbeam", + "egglog-concurrency", + "egglog-numeric-id", +] + +[[package]] +name = "egraph-serialize" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0977732fb537ace6f8c15ce160ebdda78b6502b4866d3b904e4fe752e2be4702" +dependencies = [ + "graphviz-rust", + "indexmap 2.14.0", + "once_cell", + "ordered-float", + "serde", + "serde_json", +] + +[[package]] +name = "either" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" + +[[package]] +name = "env_filter" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e90c2accc4b07a8456ea0debdc2e7587bdd890680d71173a15d4ae604f6eef" +dependencies = [ + "log", + "regex", +] + +[[package]] +name = "env_logger" +version = "0.11.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0621c04f2196ac3f488dd583365b9c09be011a4ab8b9f37248ffcc8f6198b56a" +dependencies = [ + "anstream", + "anstyle", + "env_filter", + "jiff", + "log", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys", +] + +[[package]] +name = "fastrand" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "fixedbitset" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "futures-core" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" + +[[package]] +name = "futures-util" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", +] + +[[package]] +name = "graphviz-rust" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dee83cefff83c5dd5f34c603145f4e8d478e70cc17873049b6a36eeaf37b250a" +dependencies = [ + "dot-generator", + "dot-structures", + "into-attr", + "into-attr-derive", + "pest", + "pest_derive", + "rand 0.9.4", + "tempfile", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash 0.1.5", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash 0.2.0", + "serde", + "serde_core", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "im-rc" +version = "15.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1955a75fa080c677d3972822ec4bad316169ab1cfc6c257a942c2265dbe5fe" +dependencies = [ + "bitmaps", + "rand_core 0.6.4", + "rand_xoshiro", + "sized-chunks", + "typenum", + "version_check", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", +] + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown 0.17.1", + "serde", + "serde_core", +] + +[[package]] +name = "into-attr" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18b48c537e49a709e678caec3753a7dba6854661a1eaa27675024283b3f8b376" +dependencies = [ + "dot-structures", +] + +[[package]] +name = "into-attr-derive" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecac7c1ae6cd2c6a3a64d1061a8bdc7f52ff62c26a831a2301e54c1b5d70d5b1" +dependencies = [ + "dot-generator", + "dot-structures", + "into-attr", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "jiff" +version = "0.2.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34f877a98676d2fb664698d74cc6a51ce6c484ce8c770f05d0108ec9090aeb46" +dependencies = [ + "defmt", + "jiff-static", + "log", + "portable-atomic", + "portable-atomic-util", + "serde_core", +] + +[[package]] +name = "jiff-static" +version = "0.2.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0666b5ab5ecaca213fc2a85b8c0083d9004e84ee2d5f9a7e0017aaf50986f25f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "js-sys" +version = "0.3.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03d04c30968dffe80775bd4d7fb676131cd04a1fb46d2686dbffbaec2d9dfd31" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "libc" +version = "0.2.186" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" + +[[package]] +name = "libmimalloc-sys" +version = "0.1.49" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a45a52f43e1c16f667ccfe4dd8c85b7f7c204fd5e3bf46c5b0db9a5c3c0b8e9" +dependencies = [ + "cc", +] + +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "lira" +version = "0.1.0" +dependencies = [ + "ahash", + "anyhow", + "log", + "regex", + "serde", + "serde_yaml", + "yaml-rust", +] + +[[package]] +name = "lira-tests" +version = "0.1.0" +dependencies = [ + "anyhow", + "lira", +] + +[[package]] +name = "lira_trs" +version = "0.1.0" +dependencies = [ + "ahash", + "anyhow", + "du_utils_slist", + "egglog", + "lira", + "log", +] + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "953f07c43838f8e6f9758cab68bf5bed85465e7587ebe0b823f1bcd81978ad3a" + +[[package]] +name = "memchr" +version = "2.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4" + +[[package]] +name = "mimalloc" +version = "0.1.52" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d4139bb28d14ad1facf21d5eb8825051b326e172d216b39f6d31df53cc97862" +dependencies = [ + "libmimalloc-sys", +] + +[[package]] +name = "num" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +dependencies = [ + "num-bigint", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] -name = "autocfg" -version = "1.5.1" +name = "once_cell_polyfill" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] -name = "cfg-if" -version = "1.0.4" +name = "ordered-float" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" +checksum = "b7d950ca161dc355eaf28f82b11345ed76c6e1f6eb1f4f4479e0323b9e2fbd0e" +dependencies = [ + "num-traits", + "rand 0.8.6", + "serde", +] [[package]] -name = "getrandom" -version = "0.3.4" +name = "parking_lot_core" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", - "r-efi", - "wasip2", + "redox_syscall", + "smallvec", + "windows-link", ] [[package]] -name = "hashbrown" -version = "0.12.3" +name = "pest" +version = "2.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +checksum = "e0848c601009d37dfa3430c4666e147e49cdcf1b92ecd3e63657d8a5f19da662" +dependencies = [ + "memchr", + "ucd-trie", +] [[package]] -name = "indexmap" -version = "1.9.3" +name = "pest_derive" +version = "2.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +checksum = "11f486f1ea21e6c10ed15d5a7c77165d0ee443402f0780849d1768e7d9d6fe77" dependencies = [ - "autocfg", - "hashbrown", + "pest", + "pest_generator", ] [[package]] -name = "libc" -version = "0.2.186" +name = "pest_generator" +version = "2.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" +checksum = "8040c4647b13b210a963c1ed407c1ff4fdfa01c31d6d2a098218702e6664f94f" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn 2.0.118", +] [[package]] -name = "linked-hash-map" -version = "0.5.6" +name = "pest_meta" +version = "2.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" +checksum = "89815c69d36021a140146f26659a81d6c2afa33d216d736dd4be5381a7362220" +dependencies = [ + "pest", + "sha2", +] [[package]] -name = "lira" -version = "0.1.0" +name = "petgraph" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" dependencies = [ - "ahash", - "anyhow", - "log", - "regex", + "fixedbitset", + "hashbrown 0.15.5", + "indexmap 2.14.0", "serde", - "serde_yaml", - "yaml-rust", ] [[package]] -name = "lira-tests" -version = "0.1.0" +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "portable-atomic" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" + +[[package]] +name = "portable-atomic-util" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" dependencies = [ - "anyhow", - "lira", + "portable-atomic", ] [[package]] -name = "log" -version = "0.4.32" +name = "ppv-lite86" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953f07c43838f8e6f9758cab68bf5bed85465e7587ebe0b823f1bcd81978ad3a" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] [[package]] -name = "memchr" -version = "2.8.2" +name = "proc-macro-error-attr2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] [[package]] -name = "once_cell" -version = "1.21.4" +name = "proc-macro-error2" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn 2.0.118", +] [[package]] name = "proc-macro2" @@ -146,6 +1187,92 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +[[package]] +name = "rand" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" +dependencies = [ + "rand_core 0.6.4", + "serde", +] + +[[package]] +name = "rand" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" +dependencies = [ + "rand_chacha", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "serde", +] + +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_xoshiro" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa" +dependencies = [ + "rand_core 0.6.4", +] + +[[package]] +name = "rayon" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.13.0", +] + [[package]] name = "regex" version = "1.12.4" @@ -175,12 +1302,43 @@ version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" +[[package]] +name = "rustc-hash" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags 2.13.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + [[package]] name = "ryu" version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + [[package]] name = "serde" version = "1.0.228" @@ -208,7 +1366,21 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.118", +] + +[[package]] +name = "serde_json" +version = "1.0.150" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" +dependencies = [ + "indexmap 2.14.0", + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", ] [[package]] @@ -217,12 +1389,68 @@ version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "578a7433b776b56a35785ed5ce9a7e777ac0598aac5a6dd1b4b18a307c7fc71b" dependencies = [ - "indexmap", + "indexmap 1.9.3", "ryu", "serde", "yaml-rust", ] +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "sized-chunks" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16d69225bde7a69b235da73377861095455d298f2b970996eec25ddbb42b3d1e" +dependencies = [ + "bitmaps", + "typenum", +] + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "smallvec" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "syn" version = "2.0.118" @@ -234,12 +1462,63 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom", + "once_cell", + "rustix", + "windows-sys", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + [[package]] name = "unicode-ident" version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + [[package]] name = "version_check" version = "0.9.5" @@ -255,6 +1534,76 @@ dependencies = [ "wit-bindgen", ] +[[package]] +name = "wasm-bindgen" +version = "0.2.125" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ddb3f79143bced6de84270411622a2699cee572fc0875aeaf1e7867cf9fca1a" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.125" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e21a184b13fb19e157296e2c46056aec9092264fab83e4ba59e68c61b323c3d" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.125" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fecefd9c35bd935a20fc3fc344b5f29138961e4f47fb03297d88f2587afb5ebd" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.118", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.125" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23939e44bb9a5d7576fa2b563dc2e136628f1224e88a8deed09e04858b77871f" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + [[package]] name = "wit-bindgen" version = "0.57.1" @@ -287,5 +1636,11 @@ checksum = "1ae7f38b72ec2a254e2b87ef277cf2cd4fb97cbebf944faa6f33354da0867930" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.118", ] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/rust/Cargo.toml b/rust/Cargo.toml index 724098b..f534875 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -1,7 +1,7 @@ [workspace] resolver = "3" -members = ["lira", "tests"] +members = ["lira", "lira_trs", "tests"] [workspace.dependencies] anyhow = "1.0.102" diff --git a/rust/lira_trs/Cargo.toml b/rust/lira_trs/Cargo.toml new file mode 100644 index 0000000..83493f6 --- /dev/null +++ b/rust/lira_trs/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "lira_trs" +version = "0.1.0" +edition = "2024" + +[dependencies] +lira = { path = "../lira" } +egglog = "2.0.0" +du_utils_slist = { git = "https://github.com/belovdv/du_utils.git", rev = "7813f1156c67ceb806682e18a61ce805982388a7" } +log = { workspace = true } +anyhow = { workspace = true } +ahash = { workspace = true } diff --git a/rust/lira_trs/src/dfg.rs b/rust/lira_trs/src/dfg.rs new file mode 100644 index 0000000..509540e --- /dev/null +++ b/rust/lira_trs/src/dfg.rs @@ -0,0 +1,152 @@ +use std::rc::Rc; + +use ahash::AHashMap; +use lira::{Shape, StatementSeq}; + +pub struct Statement { + pub shape: Shape, + pub outputs: Vec, + pub kind: String, + pub spec: String, + pub inputs: Vec, + pub implicit: Option, +} + +#[derive(Clone)] +pub struct Selector { + pub stmt: Rc, + pub output: usize, +} + +#[derive(Default)] +pub enum State { + #[default] + Initial, + After(Rc), +} + +impl Selector { + pub fn new(stmt: Rc, output: usize) -> Self { + Self { stmt, output } + } +} + +impl Statement { + pub fn from_stmt( + stmt: &lira::Statement, + inputs: Vec, + implicit: Option, + ) -> Self { + Self { + shape: stmt.shape.clone(), + outputs: stmt.outputs_types.clone(), + kind: stmt.kind.clone(), + spec: stmt.specifier.clone(), + inputs, + implicit, + } + } + + pub fn to_stmt(&self, outputs: Vec, inputs: Vec) -> lira::Statement { + lira::Statement { + shape: self.shape.clone(), + outputs, + outputs_types: self.outputs.clone(), + kind: self.kind.clone(), + specifier: self.spec.clone(), + inputs, + } + } +} + +pub fn lira2dfg(seq: &StatementSeq, is_pure: impl Fn(&str) -> bool) -> State { + let mut state = State::Initial; + let mut name2sel: AHashMap = AHashMap::new(); + for stmt in seq.iter() { + let is_dirty = !is_pure(&stmt.kind); + let inputs = stmt.inputs.iter().map(|i| name2sel[i].clone()).collect(); + let implicit = is_dirty.then(|| std::mem::take(&mut state)); + let s = Rc::new(Statement::from_stmt(stmt, inputs, implicit)); + if is_dirty { + state = State::After(s.clone()) + } + for o in 0..stmt.outputs.len() { + name2sel.insert(stmt.outputs[o].to_string(), Selector::new(s.clone(), o)); + } + } + state +} + +pub fn dfg2lira(state: &State) -> StatementSeq { + #[derive(Default)] + struct Ser { + seq: StatementSeq, + counter: usize, + cache: AHashMap<*const Statement, usize>, + } + impl Ser { + fn gen_temp_name(&mut self) -> String { + let name = format!("t{}", self.counter); + self.counter += 1; + name + } + fn state(&mut self, state: &State) { + let State::After(source) = state else { return }; + self.stmt(source); + } + fn sel(&mut self, sel: &Selector) -> String { + let id = self.stmt(&sel.stmt); + self.seq[id].outputs[sel.output].clone() + } + fn stmt(&mut self, stmt: &Rc) -> usize { + if let Some(outputs) = self.cache.get(&Rc::as_ptr(stmt)) { + return *outputs; + } + if let Some(implicit) = &stmt.implicit { + self.state(implicit); + } + let inputs = stmt.inputs.iter().map(|input| self.sel(input)).collect(); + let outputs = stmt.outputs.iter().map(|_| self.gen_temp_name()).collect(); + let s = stmt.to_stmt(outputs, inputs); + let id = self.seq.len(); + self.cache.insert(Rc::as_ptr(stmt), id); + self.seq.try_push(s).unwrap(); + id + } + } + let mut ser = Ser::default(); + ser.state(state); + ser.seq +} + +#[test] +fn dfg_round_trip() { + let text = "\ +1 5 ra = input 0; +1 64 delta = input 1; +1 5 rd = input 2; +1 0 unused = const 0; +1 64 base = read X ra; +1 64 addr = op add_64 base delta; +1 64 val = env load64 addr; +1 = write X rd val; +"; + // Reorder basing on dataflow, remove unused pure statement. + let text_expected = "\ +1 5 t0 = input 0; +1 64 t1 = read X t0; +1 64 t2 = input 1; +1 64 t3 = op add_64 t1 t2; +1 64 t4 = env load64 t3; +1 5 t5 = input 2; +1 = write X t5 t4; +"; + let ir = StatementSeq::parse(text).unwrap(); + let dfg = lira2dfg(&ir, |kind| ["input", "op", "const"].contains(&kind)); + let ir = dfg2lira(&dfg); + let text2 = ir.to_string(); + for stmt in ir.iter() { + eprintln!("{stmt}"); + } + assert_eq!(text2, text_expected); +} diff --git a/rust/lira_trs/src/egraph.rs b/rust/lira_trs/src/egraph.rs new file mode 100644 index 0000000..b7f1898 --- /dev/null +++ b/rust/lira_trs/src/egraph.rs @@ -0,0 +1,76 @@ +use std::borrow::Borrow; + +use du_utils_slist::{SList, StrString, parse}; + +///! Thin wrapper over [`egglog::EGraph`] + +#[derive(Default)] +pub struct EGraph { + inner: egglog::EGraph, + program: Vec, + + /// Used to generate unique names basing on pattern + counters: ahash::AHashMap, +} + +impl EGraph { + #[track_caller] + // pub fn execute(&mut self, code: &SList) -> Vec { + pub fn execute(&mut self, code: impl Borrow) -> Vec { + let code = code.borrow().to_string(); + let loc = std::panic::Location::caller(); + let r = self.inner.parse_and_run_program(None, &code); + self.program.push(code); + r.unwrap_or_else(|err| { + eprintln!("ERROR in program:"); + for line in self.program.iter() { + eprintln!(" {line}") + } + panic!("{err} at {loc}") + }) + } + #[track_caller] + pub fn execute_many(&mut self, code: &SList) { + let code = parse![code; ([*@])].unwrap(); + for code in code { + self.execute(&code); + } + } + + pub fn get_program(&self) -> &Vec { + &self.program + } + + pub fn overall_run_report(&self) -> &impl std::fmt::Display { + self.inner.get_overall_run_report() + } + + pub fn get_size(&self, func: &str) -> usize { + self.inner.get_size(func) + } + + pub fn _inner(&self) -> &egglog::EGraph { + &self.inner + } + pub fn _inner_mut(&mut self) -> &mut egglog::EGraph { + &mut self.inner + } + + pub fn gen_temp_name(&mut self, key: impl StrString) -> String { + let prefix = "_et"; + if let Some(k) = self.counters.get_mut(key.as_str()) { + *k += 1; + format!("{prefix}{k}") + } else { + self.counters.insert(key.into_string(), 0); + format!("{prefix}0") + } + } +} + +pub struct Quoted(pub T); +impl<'a, T: std::fmt::Display> ToString for &'a Quoted { + fn to_string(&self) -> String { + format!("\"{}\"", self.0) + } +} diff --git a/rust/lira_trs/src/impl_dfg3egraph.rs b/rust/lira_trs/src/impl_dfg3egraph.rs new file mode 100644 index 0000000..4e48d65 --- /dev/null +++ b/rust/lira_trs/src/impl_dfg3egraph.rs @@ -0,0 +1,296 @@ +use std::rc::Rc; + +use ahash::AHashMap; +use du_utils_slist::{SList, slist}; + +use crate::{ + dfg::{self, Statement}, + egraph::{EGraph, Quoted}, +}; + +impl EGraph { + pub fn new_dfg() -> Self { + let mut r = Self::default(); + + // Add sorts + r.execute_many(&slist![( + (sort Statement) + (datatype State (state_initial) (state_after Statement)) + (datatype Selector (sel i64 Statement)) + (datatype Shape (shape i64) (shape_dynamic i64 String)) + (sort Outputs) + (sort Inputs) + (datatype Implicit (pure) (implicit State)) + (constructor stmt (Shape Outputs String String Inputs Implicit) Statement) + )]); + for i in 0..4 { + r.add_constructor(format!("out{i}"), &vec!["i64"; i], "Outputs"); + } + for i in 0..6 { + r.add_constructor(format!("in{i}"), &vec!["Selector"; i], "Inputs"); + } + + // Add global variables namespaces + r.add_function("universe_state", &["String"], "State", None); + r.add_function("universe_stmt", &["String"], "Statement", None); + + r + } + + pub fn add_dfg(&mut self, state: &dfg::State, name: &str) { + struct Ser<'a> { + eg: &'a mut EGraph, + cache: AHashMap<*const Statement, String>, + } + impl Ser<'_> { + fn state(&mut self, state: &dfg::State) -> SList { + match state { + dfg::State::Initial => slist![(state_initial)], + dfg::State::After(statement) => { + let bound = self.stmt(statement); + slist![(state_after (universe_stmt {Quoted(bound)}))] + } + } + } + fn sel(&mut self, sel: &dfg::Selector) -> SList { + let name = self.stmt(&sel.stmt); + slist![(sel {sel.output} (universe_stmt {Quoted(name)}))] + } + fn stmt(&mut self, stmt: &Rc) -> String { + if let Some(name) = self.cache.get(&Rc::as_ptr(stmt)) { + return name.to_string(); + } + let shape = match &stmt.shape.lanes_mult { + Some(mult) => slist![(shape_dynamic {stmt.shape.lanes_base} {mult})], + None => slist![(shape {stmt.shape.lanes_base})], + }; + let outputs = slist![ + ({ format!("out{}", stmt.outputs.len()) } + [stmt.outputs.iter().map(|o| slist![{ o }])]) + ]; + let inputs: Vec<_> = stmt.inputs.iter().map(|sel| self.sel(sel)).collect(); + let inputs = slist![({ format!("in{}", inputs.len()) }[inputs])]; + let implicit = match &stmt.implicit { + Some(imp) => slist![(implicit {self.state(imp)})], + None => slist![(pure)], + }; + + let name = self.eg.gen_temp_name("add_dfg_stmt"); + self.eg.execute(slist![ + (set (universe_stmt {Quoted(&name)}) + (stmt + [[shape, outputs]] + {Quoted(&stmt.kind)} {Quoted(&stmt.spec)} + [[inputs, implicit]] + ) + ) + ]); + self.cache.insert(Rc::as_ptr(stmt), name.clone()); + name + } + } + let mut ser = Ser { + eg: self, + cache: Default::default(), + }; + let finish = ser.state(state); + self.execute(slist![(set(universe_state {Quoted(name)})[[finish]])]); + } + + pub fn get_dfg(&mut self, name: &str) -> dfg::State { + use egglog::prelude::*; + use egglog::*; + + let expr = exprs::call("universe_state", vec![exprs::string(name)]); + let (sort, value) = self._inner_mut().eval_expr(&expr).unwrap(); + let (td, t, _) = self._inner().extract_value(&sort, value).unwrap(); + let mut des = Des { + td: &td, + stmt_cache: AHashMap::new(), + }; + + struct Des<'a> { + td: &'a TermDag, + stmt_cache: AHashMap>, + } + + impl<'a> Des<'a> { + fn state(&mut self, t: TermId) -> dfg::State { + match self.td.get(t) { + Term::App(sym, children) if sym.as_str() == "state_initial" => { + dfg::State::Initial + } + Term::App(sym, children) if sym.as_str() == "state_after" => { + let stmt = self.stmt(children[0]); + dfg::State::After(stmt) + } + other => panic!("expected state, got {:?}", other), + } + } + + fn stmt(&mut self, t: TermId) -> Rc { + if let Some(stmt) = self.stmt_cache.get(&t) { + return stmt.clone(); + } + + match self.td.get(t) { + Term::App(sym, children) if sym.as_str() == "stmt" => { + let shape = self.shape(children[0]); + let outputs = self.outputs(children[1]); + let kind = self.lit_string(children[2]); + let spec = self.lit_string(children[3]); + let inputs = self.inputs(children[4]); + let implicit = self.implicit(children[5]); + + let statement = Rc::new(dfg::Statement { + shape, + outputs, + kind, + spec, + inputs, + implicit, + }); + self.stmt_cache.insert(t, statement.clone()); + statement + } + other => panic!("expected stmt, got {:?}", other), + } + } + + fn shape(&mut self, t: TermId) -> lira::Shape { + match self.td.get(t) { + Term::App(sym, children) if sym.as_str() == "shape" => { + let lanes_base = self.lit_usize(children[0]); + lira::Shape { + lanes_base, + lanes_mult: None, + } + } + Term::App(sym, children) if sym.as_str() == "shape_dynamic" => { + let lanes_base = self.lit_usize(children[0]); + let lanes_mult = Some(self.lit_string(children[1])); + lira::Shape { + lanes_base, + lanes_mult, + } + } + other => panic!("expected shape, got {:?}", other), + } + } + + fn outputs(&mut self, t: TermId) -> Vec { + match self.td.get(t) { + Term::App(sym, children) if sym.as_str().starts_with("out") => { + let mut out = Vec::new(); + for &child in children { + out.push(self.lit_usize(child)); + } + out + } + other => panic!("expected outputs, got {:?}", other), + } + } + + fn inputs(&mut self, t: TermId) -> Vec { + match self.td.get(t) { + Term::App(sym, children) if sym.as_str().starts_with("in") => { + let mut inputs = Vec::new(); + for &child in children { + inputs.push(self.selector(child)); + } + inputs + } + other => panic!("expected inputs, got {:?}", other), + } + } + + fn implicit(&mut self, t: TermId) -> Option { + match self.td.get(t) { + Term::App(sym, children) if sym.as_str() == "pure" => None, + Term::App(sym, children) if sym.as_str() == "implicit" => { + let state = self.state(children[0]); + Some(state) + } + other => panic!("expected implicit, got {:?}", other), + } + } + + fn selector(&mut self, t: TermId) -> dfg::Selector { + match self.td.get(t) { + Term::App(sym, children) if sym.as_str() == "sel" => { + let output = self.lit_usize(children[0]); + let stmt = self.stmt(children[1]); + dfg::Selector { output, stmt } + } + other => panic!("expected sel, got {:?}", other), + } + } + + fn lit_usize(&self, t: TermId) -> usize { + match self.td.get(t) { + Term::Lit(ast::Literal::Int(n)) => *n as usize, + other => panic!("expected i64 literal, got {:?}", other), + } + } + + fn lit_string(&self, t: TermId) -> String { + match self.td.get(t) { + Term::Lit(ast::Literal::String(s)) => s.to_string(), + other => panic!("expected string literal, got {:?}", other), + } + } + } + + des.state(t) + } +} + +#[test] +fn dfg3egraph() { + let text = "\ +1 64 a = get a; +1 64 b = get b; +1 64 add_a_b = op add_64 a b; +1 64 sub_a_b = op sub_64 a b; +1 64 val = op add_64 b sub_a_b; +1 = output _ val; +"; + // Optimize. Note, that commutativity is necessary + let text_expected = "\ +1 64 t0 = get a; +1 64 t1 = get b; +1 = output _ t0; +"; + let ir = lira::StatementSeq::parse(text).unwrap(); + let dfg = dfg::lira2dfg(&ir, |kind| ["input", "op", "const"].contains(&kind)); + + let mut eg = EGraph::new_dfg(); + eg.add_dfg(&dfg, "test"); + + eg.add_ruleset("opt"); + // Add commutativity + eg.add_rule( + "opt", + slist![(("=" e (stmt h o {Quoted("op")} {Quoted("add_64")} (in2 a b) m)))], + slist![(("union" e (stmt h o {Quoted("op")} {Quoted("add_64")} (in2 b a) m)))], + ); + // (add (sub a b) b) -> a + eg.add_rule( + "opt", + slist![(("=" e (sel 0 (stmt h o {Quoted("op")} {Quoted("add_64")} (in2 + (sel 0 (stmt h o {Quoted("op")} {Quoted("sub_64")} (in2 a b) (pure))) + b + ) (pure)))))], + slist![(("union" e a))], + ); + eg.run_ruleset_saturate("opt"); + + let dfg = eg.get_dfg("test"); + + let ir = dfg::dfg2lira(&dfg); + let text2 = ir.to_string(); + for stmt in ir.iter() { + eprintln!("{stmt}"); + } + assert_eq!(text2, text_expected); +} diff --git a/rust/lira_trs/src/impl_egraph.rs b/rust/lira_trs/src/impl_egraph.rs new file mode 100644 index 0000000..5d78535 --- /dev/null +++ b/rust/lira_trs/src/impl_egraph.rs @@ -0,0 +1,100 @@ +use du_utils_slist::{SList, StrString, slist}; + +use crate::egraph::EGraph; + +impl EGraph { + #[track_caller] + pub fn add_sort(&mut self, name: impl StrString) { + self.execute(slist![(sort[[name]])]); + } + + #[track_caller] + pub fn add_constructor( + &mut self, + name: impl StrString, + inputs: &[S], + sort: impl StrString, + ) { + self.execute(slist![(constructor[[name]]([inputs])[[sort]])]); + } + #[track_caller] + pub fn add_constant(&mut self, name: impl StrString, sort: impl StrString) { + self.execute(slist![(constructor[[name]]()[[sort]])]); + } + + #[track_caller] + pub fn add_relation(&mut self, name: impl StrString, inputs: &[S]) { + self.execute(slist![(relation[[name]]([inputs]))]); + } + #[track_caller] + pub fn add_relation_new(&mut self, name: impl StrString, inputs: &[S]) -> String { + let name = self.gen_temp_name(name.as_str()); + self.add_relation(&name, inputs); + name + } + + #[track_caller] + pub fn add_function( + &mut self, + name: impl StrString, + inputs: &[S], + output: impl StrString, + merge: Option<&str>, + ) { + let merge = match merge { + Some(merge) => vec![":merge", merge], + None => vec![":no-merge"], + }; + self.execute(slist![(function[[name]]([inputs])[[output]][merge])]); + } + + #[track_caller] + pub fn add_ruleset(&mut self, name: impl StrString) { + self.execute(slist![(ruleset[[name]])]); + } + #[track_caller] + pub fn add_ruleset_new(&mut self, name: impl StrString) -> String { + let name = self.gen_temp_name(name); + self.add_ruleset(&name); + name + } + + #[track_caller] + pub fn add_rule( + &mut self, + ruleset: impl StrString, + lhs: impl Into, + rhs: impl Into, + ) { + self.execute(slist![(rule [[lhs]] [[rhs]] ":ruleset" [[ruleset]])]); + } + + /// Runs given ruleset a single time + /// + /// Returns "If any changes were made to the database" + #[track_caller] + pub fn run_ruleset(&mut self, ruleset: impl StrString) -> bool { + let r = self.execute(slist![(run [[ruleset]] 1)]); + assert_eq!(r.len(), 1); + match &r[0] { + egglog::CommandOutput::RunSchedule(run_report) => run_report.updated, + r => panic!("{r:?}"), + } + } + + #[track_caller] + pub fn run_ruleset_saturate(&mut self, ruleset: impl StrString) -> bool { + let mut at_least_once = false; + while self.run_ruleset(&ruleset) { + at_least_once = true; + } + at_least_once + } + /// Runs ruleset one time. Runs second time and asserts there was no new changes. + #[track_caller] + pub fn run_ruleset_saturate_single(&mut self, ruleset: impl StrString) { + self.run_ruleset(&ruleset); + let new = self.run_ruleset(ruleset); + assert!(!new); + } +} diff --git a/rust/lira_trs/src/lib.rs b/rust/lira_trs/src/lib.rs new file mode 100644 index 0000000..168f059 --- /dev/null +++ b/rust/lira_trs/src/lib.rs @@ -0,0 +1,5 @@ +pub mod dfg; +pub mod egraph; + +mod impl_dfg3egraph; +mod impl_egraph; diff --git a/rust/lira_trs/tests/opt.egg b/rust/lira_trs/tests/opt.egg new file mode 100644 index 0000000..2c9e8c9 --- /dev/null +++ b/rust/lira_trs/tests/opt.egg @@ -0,0 +1,13 @@ +(ruleset opt) + +; Commutativity +(rule + ((= e (stmt h o "op" "add.64" (in2 a b) (pure)))) + ((union e (stmt h o "op" "add.64" (in2 b a) (pure)))) +:ruleset opt) + +; (add (sub a b) b) -> a +(rule + ((= v (sel 0 (stmt h o "op" "add.64" (in2 (sel 0 (stmt h o "op" "sub.64" (in2 a b) (pure))) b) (pure))))) + ((union v a)) +:ruleset opt) diff --git a/rust/lira_trs/tests/rewrite.rs b/rust/lira_trs/tests/rewrite.rs new file mode 100644 index 0000000..771677b --- /dev/null +++ b/rust/lira_trs/tests/rewrite.rs @@ -0,0 +1,40 @@ +use lira_trs::{dfg, egraph::EGraph}; + +#[test] +fn rewrite() { + let text = "\ +1 64 a = get a; +1 64 b = get b; +1 64 add_a_b = op add.64 a b; +1 64 sub_a_b = op sub.64 a b; +1 64 val = op add.64 b sub_a_b; +1 = output _ val; +"; + // Optimize. Note, that commutativity is necessary + let text_expected = "\ +1 64 t0 = get a; +1 64 t1 = get b; +1 = output _ t0; +"; + + let ir = lira::StatementSeq::parse(text).unwrap(); + let dfg = dfg::lira2dfg(&ir, |kind| ["input", "op", "const"].contains(&kind)); + + let mut eg = EGraph::new_dfg(); + eg.add_dfg(&dfg, "test"); + + eg._inner_mut() + .parse_and_run_program(None, include_str!("./opt.egg")) + .unwrap(); + + eg.run_ruleset_saturate("opt"); + + let dfg = eg.get_dfg("test"); + + let ir = dfg::dfg2lira(&dfg); + let text2 = ir.to_string(); + for stmt in ir.iter() { + eprintln!("{stmt}"); + } + assert_eq!(text2, text_expected); +}