diff --git a/Cargo.lock b/Cargo.lock index d5cbec337..7a0220f8b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10,14 +10,14 @@ checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "ahash" -version = "0.8.11" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", "once_cell", "version_check", - "zerocopy 0.7.35", + "zerocopy", ] [[package]] @@ -108,7 +108,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -124,7 +124,7 @@ dependencies = [ "ark-std 0.5.0", "educe 0.6.0", "fnv", - "hashbrown 0.15.2", + "hashbrown 0.15.3", "itertools 0.13.0", "num-bigint", "num-integer", @@ -189,7 +189,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" dependencies = [ "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -215,7 +215,7 @@ dependencies = [ "num-traits", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -230,7 +230,7 @@ dependencies = [ "ark-std 0.5.0", "educe 0.6.0", "fnv", - "hashbrown 0.15.2", + "hashbrown 0.15.3", ] [[package]] @@ -287,7 +287,7 @@ checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -385,7 +385,7 @@ dependencies = [ "regex", "rustc-hash 2.1.1", "shlex", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -504,7 +504,7 @@ dependencies = [ "rust-analyzer-salsa", "semver", "smol_str", - "thiserror 2.0.12", + "thiserror", ] [[package]] @@ -591,7 +591,7 @@ dependencies = [ "itertools 0.14.0", "rust-analyzer-salsa", "serde", - "thiserror 2.0.12", + "thiserror", ] [[package]] @@ -675,7 +675,7 @@ checksum = "b1e4872352761cf6d7f47eeb1626e3b1d84a514017fb4251173148d8c04f36d5" dependencies = [ "cairo-lang-debug", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -687,7 +687,7 @@ dependencies = [ "cairo-lang-filesystem", "cairo-lang-utils", "serde", - "thiserror 2.0.12", + "thiserror", "toml", ] @@ -706,7 +706,7 @@ dependencies = [ "cairo-lang-utils", "cairo-vm 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.14.0", - "thiserror 2.0.12", + "thiserror", ] [[package]] @@ -736,7 +736,7 @@ dependencies = [ "sha2", "smol_str", "starknet-types-core", - "thiserror 2.0.12", + "thiserror", ] [[package]] @@ -790,7 +790,7 @@ dependencies = [ "sha3", "smol_str", "starknet-types-core", - "thiserror 2.0.12", + "thiserror", ] [[package]] @@ -806,7 +806,7 @@ dependencies = [ "itertools 0.14.0", "num-bigint", "num-traits", - "thiserror 2.0.12", + "thiserror", ] [[package]] @@ -822,7 +822,7 @@ dependencies = [ "itertools 0.14.0", "num-bigint", "num-traits", - "thiserror 2.0.12", + "thiserror", ] [[package]] @@ -867,7 +867,7 @@ dependencies = [ "num-bigint", "num-traits", "starknet-types-core", - "thiserror 2.0.12", + "thiserror", ] [[package]] @@ -907,7 +907,7 @@ dependencies = [ "serde_json", "smol_str", "starknet-types-core", - "thiserror 2.0.12", + "thiserror", "typetag", ] @@ -931,7 +931,7 @@ dependencies = [ "sha3", "smol_str", "starknet-types-core", - "thiserror 2.0.12", + "thiserror", ] [[package]] @@ -1008,7 +1008,7 @@ version = "2.12.0-dev.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f043065d60a8a2510bfacb6c91767298fed50ed9abbd69ff7698322b7cb1e65" dependencies = [ - "hashbrown 0.15.2", + "hashbrown 0.15.3", "indexmap 2.9.0", "itertools 0.14.0", "num-bigint", @@ -1077,7 +1077,7 @@ dependencies = [ "stats_alloc", "tempfile", "test-case", - "thiserror 2.0.12", + "thiserror", "tracing", "tracing-subscriber", "utf8_iter", @@ -1094,7 +1094,7 @@ dependencies = [ "bincode 2.0.1", "bitvec", "generic-array", - "hashbrown 0.15.2", + "hashbrown 0.15.3", "hex", "indoc", "keccak", @@ -1130,7 +1130,7 @@ dependencies = [ "cairo-lang-starknet", "cairo-lang-starknet-classes", "generic-array", - "hashbrown 0.15.2", + "hashbrown 0.15.3", "hex", "indoc", "keccak", @@ -1148,7 +1148,7 @@ dependencies = [ "sha3", "starknet-crypto", "starknet-types-core", - "thiserror 2.0.12", + "thiserror", "zip", ] @@ -1166,7 +1166,7 @@ dependencies = [ "cairo-lang-starknet", "cairo-lang-starknet-classes", "generic-array", - "hashbrown 0.15.2", + "hashbrown 0.15.3", "hex", "indoc", "keccak", @@ -1184,7 +1184,7 @@ dependencies = [ "sha3", "starknet-crypto", "starknet-types-core", - "thiserror 2.0.12", + "thiserror", "zip", ] @@ -1228,9 +1228,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.19" +version = "1.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e3a13707ac958681c13b39b458c073d0d9bc8a22cb1b2f4c8e55eb72c13f362" +checksum = "8691782945451c1c383942c4874dbe63814f61cb57ef773cda2972682b7bb3c0" dependencies = [ "shlex", ] @@ -1325,7 +1325,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -1579,9 +1579,9 @@ dependencies = [ [[package]] name = "deunicode" -version = "1.6.1" +version = "1.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc55fe0d1f6c107595572ec8b107c0999bb1a2e0b75e37429a4fb0d6474a0e7d" +checksum = "abd57806937c9cc163efc8ea3910e00a62e2aeb0b8119f1793a978088f8f6b04" [[package]] name = "diff" @@ -1639,7 +1639,7 @@ dependencies = [ "enum-ordinalize", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -1651,7 +1651,7 @@ dependencies = [ "enum-ordinalize", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -1718,7 +1718,7 @@ checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -1811,7 +1811,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -1859,7 +1859,7 @@ checksum = "43eaff6bbc0b3a878361aced5ec6a2818ee7c541c5b33b5880dfa9a86c23e9e7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -1954,9 +1954,9 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" dependencies = [ "allocator-api2", "equivalent", @@ -1978,9 +1978,9 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbd780fe5cc30f81464441920d82ac8740e2e46b29a6fad543ddd075229ce37e" +checksum = "f154ce46856750ed433c8649605bf7ed2de3bc35fd9d2a9f30cddd873c80cb08" [[package]] name = "hex" @@ -2045,7 +2045,7 @@ checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -2091,7 +2091,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" dependencies = [ "equivalent", - "hashbrown 0.15.2", + "hashbrown 0.15.3", "serde", ] @@ -2338,7 +2338,7 @@ version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown 0.15.2", + "hashbrown 0.15.3", ] [[package]] @@ -2381,7 +2381,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.100", + "syn 2.0.101", "tblgen", "unindent", ] @@ -2612,7 +2612,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -2755,7 +2755,7 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "zerocopy 0.8.24", + "zerocopy", ] [[package]] @@ -2791,7 +2791,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "664ec5419c51e34154eec046ebcba56312d5a2fc3b09a06da188e1ad21afadf6" dependencies = [ "proc-macro2", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -2985,9 +2985,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.11" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3" +checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" dependencies = [ "bitflags", ] @@ -3084,7 +3084,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.100", + "syn 2.0.101", "unicode-ident", ] @@ -3114,7 +3114,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -3150,9 +3150,9 @@ dependencies = [ [[package]] name = "rustix" -version = "1.0.5" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf" +checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" dependencies = [ "bitflags", "errno", @@ -3204,7 +3204,7 @@ dependencies = [ "semver", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror", ] [[package]] @@ -3246,7 +3246,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -3295,7 +3295,7 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -3306,7 +3306,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -3332,9 +3332,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.8" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures", @@ -3386,6 +3386,7 @@ dependencies = [ "k256", "keccak", "num-bigint", + "num-integer", "num-traits", "p256", "rand 0.8.5", @@ -3399,7 +3400,7 @@ dependencies = [ "starknet-curve", "starknet-types-core", "tempfile", - "thiserror 2.0.12", + "thiserror", "tracing", "tracing-subscriber", ] @@ -3583,9 +3584,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.100" +version = "2.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" +checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" dependencies = [ "proc-macro2", "quote", @@ -3607,7 +3608,7 @@ dependencies = [ "bindgen", "cc", "paste", - "thiserror 2.0.12", + "thiserror", ] [[package]] @@ -3651,7 +3652,7 @@ dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -3662,37 +3663,17 @@ checksum = "5c89e72a01ed4c579669add59014b9a524d609c0c88c6a585ce37485879f6ffb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", "test-case-core", ] -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl 1.0.69", -] - [[package]] name = "thiserror" version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" dependencies = [ - "thiserror-impl 2.0.12", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.100", + "thiserror-impl", ] [[package]] @@ -3703,7 +3684,7 @@ checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -3763,9 +3744,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "toml" -version = "0.8.20" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" +checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae" dependencies = [ "serde", "serde_spanned", @@ -3775,26 +3756,33 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.22.24" +version = "0.22.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" +checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" dependencies = [ "indexmap 2.9.0", "serde", "serde_spanned", "toml_datetime", + "toml_write", "winnow", ] +[[package]] +name = "toml_write" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076" + [[package]] name = "tracing" version = "0.1.41" @@ -3814,7 +3802,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -3918,7 +3906,7 @@ checksum = "35f5380909ffc31b4de4f4bdf96b877175a016aa2ca98cee39fcfd8c4d53d952" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -3929,11 +3917,11 @@ checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" [[package]] name = "unescaper" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c878a167baa8afd137494101a688ef8c67125089ff2249284bd2b5f9bfedb815" +checksum = "c01d12e3a56a4432a8b436f293c25f4808bdf9e9f9f98f9260bba1f1bc5a1f26" dependencies = [ - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -4073,7 +4061,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", "wasm-bindgen-shared", ] @@ -4095,7 +4083,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4244,9 +4232,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.7.6" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63d3fcd9bba44b03821e7d699eeee959f3126dcc4aa8e4ae18ec617c2a5cea10" +checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec" dependencies = [ "memchr", ] @@ -4292,42 +4280,22 @@ checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" [[package]] name = "zerocopy" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" -dependencies = [ - "zerocopy-derive 0.7.35", -] - -[[package]] -name = "zerocopy" -version = "0.8.24" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" +checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" dependencies = [ - "zerocopy-derive 0.8.24", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.100", + "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.24" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" +checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -4347,7 +4315,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] diff --git a/debug_utils/sierra-emu/Cargo.toml b/debug_utils/sierra-emu/Cargo.toml index fa8034215..71fbc3484 100644 --- a/debug_utils/sierra-emu/Cargo.toml +++ b/debug_utils/sierra-emu/Cargo.toml @@ -23,6 +23,7 @@ cairo-lang-utils.workspace = true clap = { version = "4.5.26", features = ["derive"] } k256 = "0.13.4" keccak = "0.1.5" +num-integer.workspace = true num-bigint.workspace = true num-traits.workspace = true p256 = "0.13.2" diff --git a/debug_utils/sierra-emu/src/utils.rs b/debug_utils/sierra-emu/src/utils.rs index 4c2af0093..a2b5cc141 100644 --- a/debug_utils/sierra-emu/src/utils.rs +++ b/debug_utils/sierra-emu/src/utils.rs @@ -54,6 +54,14 @@ pub fn get_value_from_integer( CoreTypeConcrete::Uint32(_) => Value::U32(value.to_u32().unwrap()), CoreTypeConcrete::Uint64(_) => Value::U64(value.to_u64().unwrap()), CoreTypeConcrete::Uint128(_) => Value::U128(value.to_u128().unwrap()), + CoreTypeConcrete::BoundedInt(info) => { + let range = &info.range; + Value::BoundedInt { + range: range.lower.clone()..range.upper.clone(), + value, + } + } + CoreTypeConcrete::Felt252(_) => Value::Felt(value.into()), _ => panic!("cannot get integer value for a non-integer type"), } } diff --git a/debug_utils/sierra-emu/src/value.rs b/debug_utils/sierra-emu/src/value.rs index ed96be281..7c3f64c61 100644 --- a/debug_utils/sierra-emu/src/value.rs +++ b/debug_utils/sierra-emu/src/value.rs @@ -27,8 +27,11 @@ pub enum Value { value: BigInt, }, Circuit(Vec), + CircuitOutputs { + circuits: Vec, + modulus: BigUint, + }, CircuitModulus(BigUint), - CircuitOutputs(Vec), Enum { self_ty: ConcreteTypeId, index: usize, @@ -173,25 +176,31 @@ impl Value { // Circuit related types CoreTypeConcrete::Circuit(selector) => match selector { - CircuitTypeConcrete::Circuit(_) => matches!(self, Self::Circuit(_)), - CircuitTypeConcrete::CircuitData(_) => matches!(self, Self::Circuit(_)), - CircuitTypeConcrete::CircuitOutputs(_) => matches!(self, Self::CircuitOutputs(_)), - CircuitTypeConcrete::CircuitInput(_) => matches!(self, Self::Unit), - CircuitTypeConcrete::CircuitInputAccumulator(_) => matches!(self, Self::Circuit(_)), + CircuitTypeConcrete::Circuit(_) + | CircuitTypeConcrete::CircuitData(_) + | CircuitTypeConcrete::CircuitInputAccumulator(_) => { + matches!(self, Self::Circuit(_)) + } + CircuitTypeConcrete::CircuitOutputs(_) => { + matches!(self, Self::CircuitOutputs { .. }) + } CircuitTypeConcrete::CircuitModulus(_) => matches!(self, Self::CircuitModulus(_)), CircuitTypeConcrete::U96Guarantee(_) => matches!(self, Self::U128(_)), - CircuitTypeConcrete::CircuitDescriptor(_) - | CircuitTypeConcrete::CircuitFailureGuarantee(_) - | CircuitTypeConcrete::AddMod(_) + CircuitTypeConcrete::CircuitInput(_) => { + matches!(self, Self::Struct(_)) + } + CircuitTypeConcrete::U96LimbsLessThanGuarantee(_) => { + matches!(self, Self::Struct(_)) + } + CircuitTypeConcrete::AddMod(_) | CircuitTypeConcrete::MulMod(_) + | CircuitTypeConcrete::CircuitDescriptor(_) + | CircuitTypeConcrete::CircuitFailureGuarantee(_) | CircuitTypeConcrete::AddModGate(_) | CircuitTypeConcrete::CircuitPartialOutputs(_) | CircuitTypeConcrete::InverseGate(_) | CircuitTypeConcrete::MulModGate(_) - | CircuitTypeConcrete::SubModGate(_) - | CircuitTypeConcrete::U96LimbsLessThanGuarantee(_) => { - matches!(self, Self::Unit) - } + | CircuitTypeConcrete::SubModGate(_) => matches!(self, Self::Unit), }, CoreTypeConcrete::Const(info) => self.is(registry, &info.inner_ty), CoreTypeConcrete::EcOp(_) => matches!(self, Self::Unit), diff --git a/debug_utils/sierra-emu/src/vm/cast.rs b/debug_utils/sierra-emu/src/vm/cast.rs index 78330a5fc..8718dca64 100644 --- a/debug_utils/sierra-emu/src/vm/cast.rs +++ b/debug_utils/sierra-emu/src/vm/cast.rs @@ -36,6 +36,7 @@ fn eval_downcast( let [value] = get_numeric_args_as_bigints(&args[1..]).try_into().unwrap(); let int_ty = registry.get_type(&info.to_ty).unwrap(); + let range = info.to_range.lower.clone()..info.to_range.upper.clone(); if range.contains(&value) { EvalAction::NormalBranch( diff --git a/debug_utils/sierra-emu/src/vm/circuit.rs b/debug_utils/sierra-emu/src/vm/circuit.rs index 17166148d..3f154688a 100644 --- a/debug_utils/sierra-emu/src/vm/circuit.rs +++ b/debug_utils/sierra-emu/src/vm/circuit.rs @@ -12,8 +12,74 @@ use cairo_lang_sierra::{ program_registry::ProgramRegistry, }; use num_bigint::{BigInt, BigUint, Sign, ToBigInt}; +use num_integer::{ExtendedGcd, Integer}; +use num_traits::{One, ToPrimitive, Zero}; use smallvec::smallvec; +fn u384_to_struct(num: BigUint) -> Value { + let output_big = num.to_bigint().unwrap(); + + let mask: BigInt = BigInt::from_bytes_be(Sign::Plus, &[255; 12]); + + let l0: BigInt = &output_big & &mask; + let l1: BigInt = (&output_big >> 96) & &mask; + let l2: BigInt = (&output_big >> 192) & &mask; + let l3: BigInt = (output_big >> 288) & &mask; + + let range = BigInt::ZERO..(BigInt::from(1) << 96); + Value::Struct(vec![ + Value::BoundedInt { + range: range.clone(), + value: l0, + }, + Value::BoundedInt { + range: range.clone(), + value: l1, + }, + Value::BoundedInt { + range: range.clone(), + value: l2, + }, + Value::BoundedInt { range, value: l3 }, + ]) +} + +fn struct_to_u384(struct_members: Vec) -> BigUint { + let [Value::U128(l0), Value::U128(l1), Value::U128(l2), Value::U128(l3)]: [Value; 4] = + struct_members.try_into().unwrap() + else { + panic!() + }; + + let l0 = l0.to_le_bytes(); + let l1 = l1.to_le_bytes(); + let l2 = l2.to_le_bytes(); + let l3 = l3.to_le_bytes(); + + BigUint::from_bytes_le(&[ + l0[0], l0[1], l0[2], l0[3], l0[4], l0[5], l0[6], l0[7], l0[8], l0[9], l0[10], + l0[11], // + l1[0], l1[1], l1[2], l1[3], l1[4], l1[5], l1[6], l1[7], l1[8], l1[9], l1[10], + l1[11], // + l2[0], l2[1], l2[2], l2[3], l2[4], l2[5], l2[6], l2[7], l2[8], l2[9], l2[10], + l2[11], // + l3[0], l3[1], l3[2], l3[3], l3[4], l3[5], l3[6], l3[7], l3[8], l3[9], l3[10], + l3[11], // + ]) +} + +/// If the value is non-invertible a nullifier is returned instead. A nullifier +/// is value which satisfies this following equation: num * nullifier ≡ 0(modulus). +fn find_nullifier(num: &BigUint, modulus: &BigUint) -> BigUint { + let ExtendedGcd { gcd, .. } = num + .to_bigint() + .unwrap() + .extended_gcd(&modulus.to_bigint().unwrap()); + let gcd = gcd.to_biguint().unwrap(); + + modulus / gcd +} + pub fn eval( registry: &ProgramRegistry, selector: &CircuitConcreteLibfunc, @@ -48,45 +114,30 @@ pub fn eval( } } -pub fn eval_add_input( - _registry: &ProgramRegistry, - _info: &SignatureAndTypeConcreteLibfunc, +fn eval_add_input( + registry: &ProgramRegistry, + info: &SignatureAndTypeConcreteLibfunc, args: Vec, ) -> EvalAction { let [Value::Circuit(mut values), Value::Struct(members)]: [Value; 2] = args.try_into().unwrap() else { panic!() }; - assert_ne!(values.len(), values.capacity()); - let [Value::U128(l0), Value::U128(l1), Value::U128(l2), Value::U128(l3)]: [Value; 4] = - members.try_into().unwrap() - else { - panic!() + let n_inputs = match registry.get_type(&info.ty).unwrap() { + CoreTypeConcrete::Circuit(CircuitTypeConcrete::Circuit(info)) => info.circuit_info.n_inputs, + _ => panic!(), }; - let l0 = l0.to_le_bytes(); - let l1 = l1.to_le_bytes(); - let l2 = l2.to_le_bytes(); - let l3 = l3.to_le_bytes(); - values.push(BigUint::from_bytes_le(&[ - l0[0], l0[1], l0[2], l0[3], l0[4], l0[5], l0[6], l0[7], l0[8], l0[9], l0[10], - l0[11], // - l1[0], l1[1], l1[2], l1[3], l1[4], l1[5], l1[6], l1[7], l1[8], l1[9], l1[10], - l1[11], // - l2[0], l2[1], l2[2], l2[3], l2[4], l2[5], l2[6], l2[7], l2[8], l2[9], l2[10], - l2[11], // - l3[0], l3[1], l3[2], l3[3], l3[4], l3[5], l3[6], l3[7], l3[8], l3[9], l3[10], - l3[11], // - ])); + values.push(struct_to_u384(members)); EvalAction::NormalBranch( - (values.len() != values.capacity()) as usize, + (values.len() != n_inputs) as usize, smallvec![Value::Circuit(values)], ) } -pub fn eval_eval( +fn eval_eval( _registry: &ProgramRegistry, _info: &SignatureAndTypeConcreteLibfunc, _args: Vec, @@ -144,14 +195,16 @@ pub fn eval_eval( outputs[mul_gate.output] = Some((l * r) % &modulus); } (None, Some(r)) => { - let res = match r.modinv(&modulus) { - Some(inv) => inv, + match r.modinv(&modulus) { + // if it is a inv_gate the output index is store in lhs + Some(r) => outputs[mul_gate.lhs] = Some(r), + // Since we don't calculate CircuitPartialOutputs + // perform an early break None => { - panic!("attempt to divide by 0"); + outputs[mul_gate.lhs] = Some(find_nullifier(&r, &modulus)); + break false; } - }; - // if it is a inv_gate the output index is store in lhs - outputs[mul_gate.lhs] = Some(res); + } } // this state should not be reached since it would mean that // not all the circuit's inputs where filled @@ -162,28 +215,39 @@ pub fn eval_eval( } }; - let values = outputs - .into_iter() - .skip(1 + circ_info.n_inputs) - .collect::>>() - .expect("The circuit cannot be calculated"); - if success { + let values = outputs + .into_iter() + .skip(1 + circ_info.n_inputs) + .collect::>>() + .expect("The circuit cannot be calculated"); + EvalAction::NormalBranch( 0, - smallvec![add_mod, mul_mod, Value::CircuitOutputs(values)], + smallvec![ + add_mod, + mul_mod, + Value::CircuitOutputs { + circuits: values, + modulus + } + ], ) } else { EvalAction::NormalBranch(1, smallvec![add_mod, mul_mod, Value::Unit, Value::Unit]) } } -pub fn eval_get_output( +fn eval_get_output( _registry: &ProgramRegistry, _info: &ConcreteGetOutputLibFunc, args: Vec, ) -> EvalAction { - let [Value::CircuitOutputs(outputs)]: [Value; 1] = args.try_into().unwrap() else { + let [Value::CircuitOutputs { + circuits: outputs, + modulus, + }]: [Value; 1] = args.try_into().unwrap() + else { panic!() }; let circuit_info = match _registry.get_type(&_info.circuit_ty).unwrap() { @@ -193,65 +257,86 @@ pub fn eval_get_output( let gate_offset = *circuit_info.values.get(&_info.output_ty).unwrap(); let output_idx = gate_offset - 1 - circuit_info.n_inputs; let output = outputs[output_idx].to_owned(); - let output_big = output.to_bigint().unwrap(); - - let mask: BigInt = BigInt::from_bytes_be(Sign::Plus, &[255; 12]); - let l0: BigInt = &output_big & &mask; - let l1: BigInt = (&output_big >> 96) & &mask; - let l2: BigInt = (&output_big >> 192) & &mask; - let l3: BigInt = (output_big >> 288) & &mask; - - let range = BigInt::ZERO..(BigInt::from(1) << 96); - let vec_values = vec![ - Value::BoundedInt { - range: range.clone(), - value: l0, - }, - Value::BoundedInt { - range: range.clone(), - value: l1, - }, - Value::BoundedInt { - range: range.clone(), - value: l2, - }, - Value::BoundedInt { range, value: l3 }, - ]; + let output_struct = u384_to_struct(output); + let modulus = u384_to_struct(modulus); - EvalAction::NormalBranch(0, smallvec![Value::Struct(vec_values), Value::Unit]) + EvalAction::NormalBranch( + 0, + smallvec![ + output_struct.clone(), + Value::Struct(vec![output_struct, modulus]), + ], + ) } -pub fn eval_u96_limbs_less_than_guarantee_verify( +fn eval_u96_limbs_less_than_guarantee_verify( _registry: &ProgramRegistry, - _info: &ConcreteU96LimbsLessThanGuaranteeVerifyLibfunc, - _args: Vec, + info: &ConcreteU96LimbsLessThanGuaranteeVerifyLibfunc, + args: Vec, ) -> EvalAction { - EvalAction::NormalBranch(0, smallvec![Value::Unit]) + let [Value::Struct(guarantee)]: [Value; 1] = args.try_into().unwrap() else { + panic!() + }; + let limb_count = info.limb_count; + let Value::Struct(gate) = &guarantee[0] else { + panic!(); + }; + let Value::Struct(modulus) = &guarantee[1] else { + panic!(); + }; + let Value::BoundedInt { + value: gate_last_limb, + .. + } = &gate[limb_count - 1] + else { + panic!(); + }; + let Value::BoundedInt { + value: modulus_last_limb, + .. + } = &modulus[limb_count - 1] + else { + panic!(); + }; + let diff = (modulus_last_limb - gate_last_limb).to_u128().unwrap(); + + if diff != 0 { + EvalAction::NormalBranch(1, smallvec![Value::U128(diff)]) + } else { + // if there is no diff, build a new guarantee, skipping the last limb + let new_gate = Value::Struct(gate[0..limb_count].to_vec()); + let new_modulus = Value::Struct(modulus[0..limb_count].to_vec()); + + EvalAction::NormalBranch(0, smallvec![Value::Struct(vec![new_gate, new_modulus])]) + } } -pub fn eval_u96_single_limb_less_than_guarantee_verify( +fn eval_u96_single_limb_less_than_guarantee_verify( _registry: &ProgramRegistry, _info: &SignatureOnlyConcreteLibfunc, - _args: Vec, + args: Vec, ) -> EvalAction { + let [_guarantee]: [Value; 1] = args.try_into().unwrap(); + EvalAction::NormalBranch(0, smallvec![Value::U128(0)]) } -pub fn eval_u96_guarantee_verify( +fn eval_u96_guarantee_verify( _registry: &ProgramRegistry, _info: &SignatureOnlyConcreteLibfunc, - _args: Vec, + args: Vec, ) -> EvalAction { - let [range_check_96 @ Value::Unit, _]: [Value; 2] = _args.try_into().unwrap() else { - panic!() + let [range_check_96 @ Value::Unit, _]: [Value; 2] = args.try_into().unwrap() else { + panic!(); }; + EvalAction::NormalBranch(0, smallvec![range_check_96]) } -pub fn eval_failure_guarantee_verify( - _registry: &ProgramRegistry, - _info: &SignatureOnlyConcreteLibfunc, +fn eval_failure_guarantee_verify( + registry: &ProgramRegistry, + info: &SignatureOnlyConcreteLibfunc, _args: Vec, ) -> EvalAction { let [rc96 @ Value::Unit, mul_mod @ Value::Unit, _, _, _]: [Value; 5] = @@ -260,10 +345,34 @@ pub fn eval_failure_guarantee_verify( panic!() }; - EvalAction::NormalBranch(0, smallvec![rc96, mul_mod, Value::Unit]) + let limbs_count = match registry + .get_type(&info.signature.branch_signatures[0].vars[2].ty) + .unwrap() + { + CoreTypeConcrete::Circuit(CircuitTypeConcrete::U96LimbsLessThanGuarantee(info)) => { + info.limb_count + } + _ => panic!(), + }; + + let zero_u96 = Value::BoundedInt { + range: BigInt::zero()..BigInt::one() << 96, + value: 0.into(), + }; + // This should be changed with it correct value when we implement this libfunc in native + let limbs_struct = Value::Struct(vec![zero_u96; limbs_count]); + + EvalAction::NormalBranch( + 0, + smallvec![ + rc96, + mul_mod, + Value::Struct(vec![limbs_struct.clone(), limbs_struct]) + ], + ) } -pub fn eval_get_descriptor( +fn eval_get_descriptor( _registry: &ProgramRegistry, _info: &SignatureAndTypeConcreteLibfunc, _args: Vec, @@ -271,7 +380,7 @@ pub fn eval_get_descriptor( EvalAction::NormalBranch(0, smallvec![Value::Unit]) } -pub fn eval_init_circuit_data( +fn eval_init_circuit_data( _registry: &ProgramRegistry, info: &SignatureAndTypeConcreteLibfunc, args: Vec, @@ -294,7 +403,7 @@ pub fn eval_init_circuit_data( ) } -pub fn eval_try_into_circuit_modulus( +fn eval_try_into_circuit_modulus( _registry: &ProgramRegistry, _info: &SignatureOnlyConcreteLibfunc, args: Vec, @@ -331,14 +440,14 @@ pub fn eval_try_into_circuit_modulus( let value = l0 | (l1 << 96) | (l2 << 192) | (l3 << 288); - // a CircuitModulus must not be neither 0 nor 1 - assert_ne!(value, 0_u8.into()); - assert_ne!(value, 1_u8.into()); - - EvalAction::NormalBranch(0, smallvec![Value::CircuitModulus(value)]) + if value > BigUint::one() { + EvalAction::NormalBranch(0, smallvec![Value::CircuitModulus(value)]) + } else { + EvalAction::NormalBranch(1, smallvec![]) + } } -pub fn eval_into_u96_guarantee( +fn eval_into_u96_guarantee( _registry: &ProgramRegistry, _info: &SignatureAndTypeConcreteLibfunc, args: Vec, diff --git a/debug_utils/sierra-emu/src/vm/ec.rs b/debug_utils/sierra-emu/src/vm/ec.rs index 64ab9828a..b9ab8933d 100644 --- a/debug_utils/sierra-emu/src/vm/ec.rs +++ b/debug_utils/sierra-emu/src/vm/ec.rs @@ -34,11 +34,11 @@ pub fn eval( EcConcreteLibfunc::StateAddMul(info) => eval_state_add_mul(registry, info, args), EcConcreteLibfunc::PointFromX(info) => eval_point_from_x(registry, info, args), EcConcreteLibfunc::UnwrapPoint(info) => eval_unwrap_point(registry, info, args), - EcConcreteLibfunc::Zero(_) => todo!(), + EcConcreteLibfunc::Zero(info) => eval_zero(registry, info, args), } } -pub fn eval_is_zero( +fn eval_is_zero( _registry: &ProgramRegistry, _info: &SignatureOnlyConcreteLibfunc, args: Vec, @@ -55,7 +55,7 @@ pub fn eval_is_zero( } } -pub fn eval_unwrap_point( +fn eval_unwrap_point( _registry: &ProgramRegistry, _info: &SignatureOnlyConcreteLibfunc, args: Vec, @@ -66,7 +66,7 @@ pub fn eval_unwrap_point( EvalAction::NormalBranch(0, smallvec![Value::Felt(x), Value::Felt(y)]) } -pub fn eval_neg( +fn eval_neg( _registry: &ProgramRegistry, _info: &SignatureOnlyConcreteLibfunc, args: Vec, @@ -86,7 +86,7 @@ pub fn eval_neg( ) } -pub fn eval_new( +fn eval_new( _registry: &ProgramRegistry, _info: &SignatureOnlyConcreteLibfunc, args: Vec, @@ -107,7 +107,7 @@ pub fn eval_new( } } -pub fn eval_state_init( +fn eval_state_init( _registry: &ProgramRegistry, _info: &SignatureOnlyConcreteLibfunc, _args: Vec, @@ -125,7 +125,7 @@ pub fn eval_state_init( ) } -pub fn eval_state_add( +fn eval_state_add( _registry: &ProgramRegistry, _info: &SignatureOnlyConcreteLibfunc, args: Vec, @@ -153,7 +153,7 @@ pub fn eval_state_add( ) } -pub fn eval_state_add_mul( +fn eval_state_add_mul( _registry: &ProgramRegistry, _info: &SignatureOnlyConcreteLibfunc, args: Vec, @@ -184,7 +184,7 @@ pub fn eval_state_add_mul( ) } -pub fn eval_state_finalize( +fn eval_state_finalize( _registry: &ProgramRegistry, _info: &SignatureOnlyConcreteLibfunc, args: Vec, @@ -211,7 +211,7 @@ pub fn eval_state_finalize( } } -pub fn eval_point_from_x( +fn eval_point_from_x( _registry: &ProgramRegistry, _info: &SignatureOnlyConcreteLibfunc, args: Vec, @@ -258,3 +258,17 @@ fn random_ec_point() -> AffinePoint { AffinePoint::new(random_x, random_y).unwrap() } + +fn eval_zero( + _registry: &ProgramRegistry, + _info: &SignatureOnlyConcreteLibfunc, + _args: Vec, +) -> EvalAction { + EvalAction::NormalBranch( + 0, + smallvec![Value::EcPoint { + x: 0.into(), + y: 0.into() + }], + ) +} diff --git a/debug_utils/sierra-emu/src/vm/felt252_dict_entry.rs b/debug_utils/sierra-emu/src/vm/felt252_dict_entry.rs index a93132580..1f0da1a01 100644 --- a/debug_utils/sierra-emu/src/vm/felt252_dict_entry.rs +++ b/debug_utils/sierra-emu/src/vm/felt252_dict_entry.rs @@ -29,17 +29,19 @@ pub fn eval_get( let [Value::FeltDict { ty, mut data, - count, + mut count, }, Value::Felt(key)]: [Value; 2] = args.try_into().unwrap() else { panic!() }; assert_eq!(info.ty, ty); - let default_value = Value::default_for_type(registry, &info.ty); - data.insert(key, default_value.clone()); + let value = data + .entry(key) + .or_insert(Value::default_for_type(registry, &ty)) + .clone(); - let count = count + 1; + count += 1; EvalAction::NormalBranch( 0, @@ -50,7 +52,7 @@ pub fn eval_get( count, key }, - default_value, + value ], ) } diff --git a/debug_utils/sierra-emu/tests/common/mod.rs b/debug_utils/sierra-emu/tests/common/mod.rs index 0f9a0befe..b1dbec34e 100644 --- a/debug_utils/sierra-emu/tests/common/mod.rs +++ b/debug_utils/sierra-emu/tests/common/mod.rs @@ -20,7 +20,15 @@ pub fn value_to_felt(value: &Value) -> Vec { costs.mul_mod.into(), ], Value::CircuitModulus(value) => vec![value.into()], - Value::Circuit(data) | Value::CircuitOutputs(data) => data.iter().map(Felt::from).collect(), + Value::Circuit(data) => data.iter().map(Felt::from).collect(), + Value::CircuitOutputs { + circuits: data, + modulus, + } => { + let mut felts = data.iter().map(Felt::from).collect::>(); + felts.push(modulus.into()); + felts + } Value::EcPoint { x, y } => { vec![*x, *y] } diff --git a/debug_utils/sierra-emu/tests/corelib.rs b/debug_utils/sierra-emu/tests/corelib.rs index 50bd5d5ea..1b032abcc 100644 --- a/debug_utils/sierra-emu/tests/corelib.rs +++ b/debug_utils/sierra-emu/tests/corelib.rs @@ -65,6 +65,7 @@ fn test_corelib() { "core::test::dict_test::test_array_from_squash_dict", "core::test::hash_test::test_blake2s", "core::test::testing_test::test_get_unspent_gas", + "core::test::qm31_test::", ]; let compiled = compile_tests( @@ -104,7 +105,7 @@ fn run_tests(compiled: TestCompilation) -> Vec { program.clone(), EntryPoint::String(name.clone()), vec![], - u64::MAX, + test.available_gas.map(|g| g as u64).unwrap_or_default(), ) }); diff --git a/debug_utils/sierra-emu/tests/libfuncs.rs b/debug_utils/sierra-emu/tests/libfuncs.rs index e7181885a..ff7a5ad82 100644 --- a/debug_utils/sierra-emu/tests/libfuncs.rs +++ b/debug_utils/sierra-emu/tests/libfuncs.rs @@ -145,13 +145,3 @@ fn test_run_full_circuit() { assert_eq!(**payload, expected_output); } - -#[test] -#[should_panic(expected = "attempt to divide by 0")] -fn test_circuit_failure() { - run_program( - "tests/tests/circuits_failure.cairo", - "circuits_failure::circuits_failure::main", - &[], - ); -} diff --git a/debug_utils/sierra-emu/tests/tests/circuits_failure.cairo b/debug_utils/sierra-emu/tests/tests/circuits_failure.cairo deleted file mode 100644 index fcf2684d0..000000000 --- a/debug_utils/sierra-emu/tests/tests/circuits_failure.cairo +++ /dev/null @@ -1,20 +0,0 @@ -use core::circuit::{ - RangeCheck96, AddMod, MulMod, u96, CircuitElement, CircuitInput, circuit_add, circuit_sub, - circuit_mul, circuit_inverse, EvalCircuitTrait, u384, CircuitOutputsTrait, CircuitModulus, - AddInputResultTrait, CircuitInputs, -}; - -fn main() { - let in1 = CircuitElement::> {}; - let inv = circuit_inverse(in1); - - let modulus = TryInto::<_, CircuitModulus>::try_into([7, 0, 0, 0]).unwrap(); - let outputs = (inv,) - .new_inputs() - .next([0, 0, 0, 0]) - .done() - .eval(modulus) - .unwrap(); - - outputs.get_output(inv); -} diff --git a/src/metadata/trace_dump.rs b/src/metadata/trace_dump.rs index 92e89aa0e..c0fb53d87 100644 --- a/src/metadata/trace_dump.rs +++ b/src/metadata/trace_dump.rs @@ -208,7 +208,7 @@ pub mod trace_dump_runtime { }; use cairo_lang_utils::ordered_hash_map::OrderedHashMap; use itertools::Itertools; - use num_bigint::{BigInt, BigUint}; + use num_bigint::{BigInt, BigUint, Sign}; use num_traits::One; use sierra_emu::{ starknet::{ @@ -227,7 +227,11 @@ pub mod trace_dump_runtime { sync::{LazyLock, Mutex}, }; - use crate::{starknet::ArrayAbi, types::TypeBuilder}; + use crate::{ + starknet::ArrayAbi, + types::TypeBuilder, + utils::{get_integer_layout, layout_repeat}, + }; use crate::runtime::FeltDict; @@ -565,21 +569,33 @@ pub mod trace_dump_runtime { panic!("generic arg should be a Circuit"); }; - let u384_layout = Layout::from_size_align(48, 16).unwrap(); + let u96_layout = get_integer_layout(96); let n_outputs = circuit.circuit_info.values.len(); let mut values = Vec::with_capacity(n_outputs); - let value_ptr = value_ptr.cast::<[u8; 48]>(); + let (u384_struct_layout, _) = layout_repeat(&u96_layout, 4).unwrap(); + let (gates_array_layout, gate_stride) = + layout_repeat(&u384_struct_layout, n_outputs).unwrap(); + let (_, modulus_offset) = + gates_array_layout.extend(u384_struct_layout).unwrap(); + + let value_ptr = value_ptr.cast::<[u8; 12]>(); + // get gate values for i in 0..n_outputs { - let size = u384_layout.pad_to_align().size(); - let current_ptr = value_ptr.byte_add(size * i); - let current_value = current_ptr.as_ref(); - values.push(BigUint::from_bytes_le(current_value)); + let gate_ptr = value_ptr.byte_add(gate_stride * i); + values.push(u384_struct_to_bigint(gate_ptr, 4)); } - Value::CircuitOutputs(values) + // get modulus value + let modulus_ptr = value_ptr.byte_add(modulus_offset); + let modulus = u384_struct_to_bigint(modulus_ptr, 4); + + Value::CircuitOutputs { + circuits: values, + modulus, + } } CircuitTypeConcrete::CircuitPartialOutputs(_) => { todo!("CircuitTypeConcrete::CircuitPartialOutputs") @@ -627,7 +643,6 @@ pub mod trace_dump_runtime { let value = unsafe { value_ptr.as_ref() }; Value::CircuitModulus(BigUint::from_bytes_le(value)) } - CircuitTypeConcrete::InverseGate(_) => Value::Unit, CircuitTypeConcrete::MulModGate(_) => Value::Unit, CircuitTypeConcrete::SubModGate(_) => Value::Unit, @@ -640,7 +655,40 @@ pub mod trace_dump_runtime { Value::U128(u128::from_le_bytes(array_value)) } - CircuitTypeConcrete::U96LimbsLessThanGuarantee(_) => Value::Unit, + CircuitTypeConcrete::U96LimbsLessThanGuarantee(info) => { + let value_ptr = value_ptr.cast::<[u8; 12]>(); + + let u96_layout = get_integer_layout(96); + let (u384_struct_layout, struct_stride) = + layout_repeat(&u96_layout, info.limb_count).unwrap(); + + let output_limbs = (0..info.limb_count) + .map(|i| { + let current_ptr = value_ptr.byte_add(struct_stride * i); + Value::BoundedInt { + range: 0.into()..BigInt::one() << 96, + value: BigInt::from_bytes_le(Sign::Plus, current_ptr.as_ref()), + } + }) + .collect::>(); + + let modulus_ptr = value_ptr.byte_add(u384_struct_layout.size()); + + let modulus_limbs = (0..info.limb_count) + .map(|i| { + let current_ptr = modulus_ptr.byte_add(struct_stride * i); + Value::BoundedInt { + range: 0.into()..BigInt::one() << 96, + value: BigInt::from_bytes_le(Sign::Plus, current_ptr.as_ref()), + } + }) + .collect::>(); + + Value::Struct(vec![ + Value::Struct(output_limbs), + Value::Struct(modulus_limbs), + ]) + } }, CoreTypeConcrete::Const(_) => todo!("CoreTypeConcrete::Const"), CoreTypeConcrete::Sint8(_) => Value::I8(value_ptr.cast().read()), @@ -772,6 +820,20 @@ pub mod trace_dump_runtime { } } + unsafe fn u384_struct_to_bigint(value_ptr: NonNull<[u8; 12]>, limbs_count: usize) -> BigUint { + let u96_layout = get_integer_layout(96); + let (_, elem_stride) = layout_repeat(&u96_layout, 4).unwrap(); + + let output_limbs = (0..limbs_count) + .flat_map(|i| { + let offset = elem_stride * i; + *value_ptr.byte_add(offset).as_ref() + }) + .collect::>(); + + BigUint::from_bytes_le(&output_limbs) + } + #[derive(Debug)] struct FeltDictEntry<'a> { dict: &'a FeltDict,