diff --git a/.trinity/seals/RTL.json b/.trinity/seals/RTL.json index 7caaa453d..2e6cc16d0 100644 --- a/.trinity/seals/RTL.json +++ b/.trinity/seals/RTL.json @@ -1,11 +1,11 @@ { - "gen_hash_c": "sha256:1945661a496c2167d83ab69a59aa4b20003bc5c7b3c6da77ffa6627b24aa4c14", + "gen_hash_c": "sha256:ef9baccc649f77a9e7a8c930563535eff1a9c00a42703f261fea55e922c3bcce", "gen_hash_rust": "sha256:78753bc84edf9c0715982b590dc8acf77012445af5cba89db256fa7be1e457b6", "gen_hash_verilog": "sha256:d211220b876e0ff3a84b44de3a618dc7a8eeb8e5b6e7a54294fadf371e12af6d", "gen_hash_zig": "sha256:35e90b4869e68454c87458f55510d22690aaa056d3069c218b9a797a693d4059", "module": "RTL", "ring": 32, - "sealed_at": "2026-09-08T12:36:52Z", + "sealed_at": "2026-09-08T13:02:06Z", "spec_hash": "sha256:d062a67d5cea57f6533fdc506780b589c98ff079f673b59676d7062dc3ae2b56", "spec_path": "specs/igla/race/rtl.t27" } \ No newline at end of file diff --git a/.trinity/seals/coder_igla-coder-arch.json b/.trinity/seals/coder_igla-coder-arch.json index 210f4ab33..09a44c6fb 100644 --- a/.trinity/seals/coder_igla-coder-arch.json +++ b/.trinity/seals/coder_igla-coder-arch.json @@ -1,11 +1,11 @@ { - "gen_hash_c": "sha256:e40cd29e2a987dbc61d5955b6a59f02344eff3a2566e31b692516f510bb65d51", + "gen_hash_c": "sha256:d9a842fcc4f0774f3145aa7477875156e43f3a6c900825bc7b19993782adec15", "gen_hash_rust": "sha256:c74ffd16d6a53e65bbce0f62af1e6611a44710dacff344b3ea28401fb5c6aad2", "gen_hash_verilog": "sha256:7ad38e94255fb3442588369b348b61df4d302df3e783ebf8fd0a203ec5e28e1c", "gen_hash_zig": "sha256:b901b1daef237e8ab4ab5171e4546dceb3426bdf6c008f2077776b97bab785bc", "module": "igla-coder-arch", "ring": 12, - "sealed_at": "2026-09-08T12:14:22Z", + "sealed_at": "2026-09-08T13:02:04Z", "sealed_by": "t27c-bootstrap@0.2.0", "spec_hash": "sha256:01353d9b489c0adbf88cda433d9b37fa974ab73977195601a6dea9feec74d740", "spec_path": "specs/igla/coder/arch.t27" diff --git a/.trinity/seals/coder_igla-coder-bench-proxy.json b/.trinity/seals/coder_igla-coder-bench-proxy.json index 763729c49..2a306ab06 100644 --- a/.trinity/seals/coder_igla-coder-bench-proxy.json +++ b/.trinity/seals/coder_igla-coder-bench-proxy.json @@ -1,11 +1,11 @@ { - "gen_hash_c": "sha256:46c27d3f7dd95c79484bfbeb3833656bd0b3f565a21435e8cd1fab147fb71ac0", + "gen_hash_c": "sha256:911394d5061506c882251bb9dc921e47b5ba64fdd0176824f4f1b93c2ccce0ed", "gen_hash_rust": "sha256:c99ed5193176286804ef9d877be6677bced32d8d7c5d71ca477739dd4371746e", "gen_hash_verilog": "sha256:5af3c7fb7e7cf1c84b01caf7c7e99fa1aa5c6634f27334737718ef9f6eda6743", "gen_hash_zig": "sha256:7c72c5fe2f980dfc3fd483a94e075a09a071a7229d95a2b636553dbe5bab9d6c", "module": "igla-coder-bench-proxy", "ring": 12, - "sealed_at": "2026-09-08T10:55:57Z", + "sealed_at": "2026-09-08T13:02:04Z", "sealed_by": "t27c-bootstrap@0.2.0", "spec_hash": "sha256:9b0d8c306d6de9f1140ce238ef58b1c955fc6483777c811339bff18da582ab4c", "spec_path": "specs/igla/coder/bench_proxy.t27" diff --git a/.trinity/seals/coder_igla-coder-benchmark.json b/.trinity/seals/coder_igla-coder-benchmark.json index 5b0b51143..aba5faa83 100644 --- a/.trinity/seals/coder_igla-coder-benchmark.json +++ b/.trinity/seals/coder_igla-coder-benchmark.json @@ -1,11 +1,11 @@ { - "gen_hash_c": "sha256:a60e2287009a5a83e24ea4417252138cbed8fd4e6f8a56ed693639a474414432", + "gen_hash_c": "sha256:465bfbe6b9839bd1ca0b86f45de0e539a511d132ba72c63d3756892a03464460", "gen_hash_rust": "sha256:a3fca9ee8ea5a922318c415c78dfddc14a93b29fdfc693e88d21ab451e9a36f4", "gen_hash_verilog": "sha256:829aa193ca03b2c33b60c4038c77e06f24939bb9e3dd52a88348d8f9be62aefd", "gen_hash_zig": "sha256:3b10b64c4d2487cfcefc130f4d1ac1020f47d5294957c4717df407278aeefb6a", "module": "igla-coder-benchmark", "ring": 12, - "sealed_at": "2026-09-08T12:14:23Z", + "sealed_at": "2026-09-08T13:02:05Z", "sealed_by": "t27c-bootstrap@0.2.0", "spec_hash": "sha256:3bc0b4f043a561e151081570bb5035fa4e54b3a62b061619056f8a13ecdcb1d8", "spec_path": "specs/igla/coder/benchmark.t27" diff --git a/.trinity/seals/coder_igla-coder-dataset.json b/.trinity/seals/coder_igla-coder-dataset.json index b725db6fd..3e18e9569 100644 --- a/.trinity/seals/coder_igla-coder-dataset.json +++ b/.trinity/seals/coder_igla-coder-dataset.json @@ -1,11 +1,11 @@ { - "gen_hash_c": "sha256:65a5b0e24b06b31aebfd56fff667a19cece8900b33063848dae7c0f095d2b21b", + "gen_hash_c": "sha256:9b0af61e756a25bb4faada9b75d68bd781e8cecb765f77e9b2134015ae4ad93d", "gen_hash_rust": "sha256:b725d5db75bc0e7e668119d0967b03e581cbebaff0115e640762bef3f532d62b", "gen_hash_verilog": "sha256:ca4b5edae76903601e57b78b3ad9892a1f37b85d377653ba816ef26460527529", "gen_hash_zig": "sha256:9cc02f8da315f4d5ecbe7ab6023af027e33f4e0572a9b2bab55e73151511d99f", "module": "igla-coder-dataset", "ring": 12, - "sealed_at": "2026-09-08T12:14:23Z", + "sealed_at": "2026-09-08T13:02:05Z", "sealed_by": "t27c-bootstrap@0.2.0", "spec_hash": "sha256:b9a67a36ec91ba9f2df7afb43a264d152ae0c5577e29f11371fcb39668aad0d2", "spec_path": "specs/igla/coder/dataset.t27" diff --git a/.trinity/seals/coder_igla-coder-eval.json b/.trinity/seals/coder_igla-coder-eval.json index 89264d536..6b1cceea8 100644 --- a/.trinity/seals/coder_igla-coder-eval.json +++ b/.trinity/seals/coder_igla-coder-eval.json @@ -1,11 +1,11 @@ { - "gen_hash_c": "sha256:6e3b0d64f89cded1184527fa30b4b28e4efccce0501a72e37aa53f2ef312d15c", + "gen_hash_c": "sha256:033d70a13f69a7d416b40f7888686afa2d6784c0f1cfcbe478077335988d75db", "gen_hash_rust": "sha256:f8ccfb7b1aaf5cfa0c7c10290463cb1b12e1a36935670fb83db3629146a2340e", "gen_hash_verilog": "sha256:a8b606f5eaf20caaf68306139b4b50009c29fd846c0a488869a52a3c7ec16946", "gen_hash_zig": "sha256:86f8c3f2cd967e405ef4437bf8a8ed5c9c2bd3e98eb30043cbd957f06a7a3ff7", "module": "igla-coder-eval", "ring": 12, - "sealed_at": "2026-09-08T12:36:52Z", + "sealed_at": "2026-09-08T13:02:05Z", "sealed_by": "t27c-bootstrap@0.2.0", "spec_hash": "sha256:c79668668fd5c4248c5be928bfb4965bf3ae44158fbfc3c56d89f396d573172d", "spec_path": "specs/igla/coder/eval.t27" diff --git a/.trinity/seals/coder_igla-coder-pipeline.json b/.trinity/seals/coder_igla-coder-pipeline.json index 2d7b7726d..49ca0867a 100644 --- a/.trinity/seals/coder_igla-coder-pipeline.json +++ b/.trinity/seals/coder_igla-coder-pipeline.json @@ -1,11 +1,11 @@ { - "gen_hash_c": "sha256:69d1b3405d59c32dd82539c0aa4bc46fb77a7dcf1032164681ea76c2b21b8045", + "gen_hash_c": "sha256:0f1d9418af6e168431f681f4268148e56b5bce1bf629577ee69685c26c708231", "gen_hash_rust": "sha256:eb4c6582020de55d0301b9a7f47d4770a59907a5f81318e8c5054a4bc66b00eb", "gen_hash_verilog": "sha256:a05bd90f9cff0b53f50cac2a23715caf215032d0c723ba57637cfd4210293aa9", "gen_hash_zig": "sha256:db388c8f28e2796ece2eb1b66b6c4cc26759ffb5504a71c5e7c16a990b1aaa1e", "module": "igla-coder-pipeline", "ring": 12, - "sealed_at": "2026-09-08T12:36:52Z", + "sealed_at": "2026-09-08T13:02:05Z", "sealed_by": "t27c-bootstrap@0.2.0", "spec_hash": "sha256:7ced47ba19d0e638422a4fb841c25e3abd45b561787e18f3d62f2bcad90321da", "spec_path": "specs/igla/coder/pipeline.t27" diff --git a/.trinity/seals/coder_igla-coder-prm.json b/.trinity/seals/coder_igla-coder-prm.json index f23bd9dca..97ba88920 100644 --- a/.trinity/seals/coder_igla-coder-prm.json +++ b/.trinity/seals/coder_igla-coder-prm.json @@ -1,11 +1,11 @@ { - "gen_hash_c": "sha256:5cd2d918a14bd1903b3fba75511bd48411effb613d93726164c43d5cf7ea0086", + "gen_hash_c": "sha256:1b0ae52d1fd3f3f790a64ea1fdb80ffdf5ff3b17934e089490cb64d03b66103c", "gen_hash_rust": "sha256:efdee3a1ab6c5ca9a5c1f2abf5af10ea99f9b8ac3c01e3c92ab37f3c2808d68d", "gen_hash_verilog": "sha256:bf1b217f773539abf6bce685e982cc54199da697e41253801a04fb4450275467", "gen_hash_zig": "sha256:cf646f30a60f5e79071b622165e3861170a11d13aa52498b17728d114f3bb87e", "module": "igla-coder-prm", "ring": 12, - "sealed_at": "2026-09-08T12:14:23Z", + "sealed_at": "2026-09-08T13:02:05Z", "sealed_by": "t27c-bootstrap@0.2.0", "spec_hash": "sha256:3eee11bf8df22d370b2a4d29b3a2ddb4bcff529c01e3a23212962b6f7db44ded", "spec_path": "specs/igla/coder/prm.t27" diff --git a/.trinity/seals/coder_igla-coder-tokenizer.json b/.trinity/seals/coder_igla-coder-tokenizer.json index 066397c44..ac169a598 100644 --- a/.trinity/seals/coder_igla-coder-tokenizer.json +++ b/.trinity/seals/coder_igla-coder-tokenizer.json @@ -1,11 +1,11 @@ { - "gen_hash_c": "sha256:2fac9a88fd7e71bbe60518b7310e16742bf85019a4a03133468de808d34a82f9", + "gen_hash_c": "sha256:532a88142d3303dbd598eb5658c794afa99c2692b7f3c5d6be1c2c3c6003566a", "gen_hash_rust": "sha256:c0f00ace59cd9774faa64bbe5b7e54872c0d5bccc56159f5361833b67cc17193", "gen_hash_verilog": "sha256:c172ed1393dcbaa31d882b80ff1bc6fe0e4629a021de15653f8b47140df35775", "gen_hash_zig": "sha256:27ab8c368cd75f327f1acaeea4daaf6855be4db5e5d3440d4773c59dd1bcfd79", "module": "igla-coder-tokenizer", "ring": 12, - "sealed_at": "2026-09-08T12:14:24Z", + "sealed_at": "2026-09-08T13:02:05Z", "sealed_by": "t27c-bootstrap@0.2.0", "spec_hash": "sha256:5a4913e61e90b9be2632619b3eb79b7a93a445d36fa724601fac5f95e3c7a283", "spec_path": "specs/igla/coder/tokenizer.t27" diff --git a/.trinity/seals/coder_igla-coder-training.json b/.trinity/seals/coder_igla-coder-training.json index 23cc73ded..b9c952fe9 100644 --- a/.trinity/seals/coder_igla-coder-training.json +++ b/.trinity/seals/coder_igla-coder-training.json @@ -1,11 +1,11 @@ { - "gen_hash_c": "sha256:0be16cca91db0f4eb8e725d06d63807b8c40d782fd14ebc54b3e9ad8f99c197a", + "gen_hash_c": "sha256:282cd3ba35c3311ad0514b531508b50a3d9469c136bfad3b3b5f0773959a6434", "gen_hash_rust": "sha256:759befd74dc3dae89f9a48dd0f74432e8d3c2d33f7cab17b0987d10ec26b0efc", "gen_hash_verilog": "sha256:dd7901d16fd6b3f3479374459e3a819cc448fc3c28b55582ad0bb550eb6967bd", "gen_hash_zig": "sha256:f4311a46769be6e4fffee985c5ecfd91573150569ef770a3b3d483065c93c604", "module": "igla-coder-training", "ring": 12, - "sealed_at": "2026-09-08T12:36:52Z", + "sealed_at": "2026-09-08T13:02:05Z", "sealed_by": "t27c-bootstrap@0.2.0", "spec_hash": "sha256:ad23bb061da98f151cca70bbc2e6be16536f23f09d867aac11c2040a2427ac82", "spec_path": "specs/igla/coder/training.t27" diff --git a/.trinity/seals/coder_igla-coder-weights.json b/.trinity/seals/coder_igla-coder-weights.json index a8a9a07ba..90bba9496 100644 --- a/.trinity/seals/coder_igla-coder-weights.json +++ b/.trinity/seals/coder_igla-coder-weights.json @@ -1,11 +1,11 @@ { - "gen_hash_c": "sha256:395d3292902a906c3a8994f0ed15c3a498afe05749eb83fe4258b454e1fe4579", + "gen_hash_c": "sha256:d84fbb5e93248e90842d13e846470eb2ba9f131d2b136945984e51a4e002c8d1", "gen_hash_rust": "sha256:b21bd972ff362927011d1e76f2d9841cf7fff8fd81c9a80053c3167364b03eb2", "gen_hash_verilog": "sha256:4f92a4528c6de26a76d0bac3bbc3456ff058cdc71dff06463ffa8f0fc473fa9e", "gen_hash_zig": "sha256:b6906990ff354d8f893c6f12558706bbd8037af4b3e6b872758c99ec392e10ba", "module": "igla-coder-weights", "ring": 12, - "sealed_at": "2026-09-08T12:14:24Z", + "sealed_at": "2026-09-08T13:02:06Z", "sealed_by": "t27c-bootstrap@0.2.0", "spec_hash": "sha256:ff49a27495a6de1e3fa7c6a16ed855385c7f772a67591d593199659d5387f814", "spec_path": "specs/igla/coder/weights.t27" diff --git a/.trinity/seals/race_igla-race-bram-weights.json b/.trinity/seals/race_igla-race-bram-weights.json index 916301793..d4d287f95 100644 --- a/.trinity/seals/race_igla-race-bram-weights.json +++ b/.trinity/seals/race_igla-race-bram-weights.json @@ -1,11 +1,11 @@ { - "gen_hash_c": "sha256:040f7e8989d673a9993cf3cdabe073ca4d71367ce3b09b950eec08bcc3305062", + "gen_hash_c": "sha256:5318eadaffae8c76b19b363ca7fee0f9ea1c6ce7dd75b4378b573ae3125a2d57", "gen_hash_rust": "sha256:3db3a72af18db33c0872f21f85616f0377fabed62a03095413f0925ceee2c43e", "gen_hash_verilog": "sha256:95fe5c7439755c0a1d3be6f45c5c6b23491102342e304243a09627257b5c5dd6", "gen_hash_zig": "sha256:a0808038eee6da41024db193e8f297f92211a967a0a66da07ac049d3075cec9f", "module": "igla-race-bram-weights", "ring": 12, - "sealed_at": "2026-09-08T12:36:52Z", + "sealed_at": "2026-09-08T13:02:06Z", "sealed_by": "t27c-bootstrap@0.2.0", "spec_hash": "sha256:2e64758765a33902d746fd41a11372846b5aa2e7d2b027c25908bda679cb3a0c", "spec_path": "specs/igla/race/bram_weights.t27" diff --git a/.trinity/seals/race_igla-race-cordic-top.json b/.trinity/seals/race_igla-race-cordic-top.json index 941e6c33d..cdd39b200 100644 --- a/.trinity/seals/race_igla-race-cordic-top.json +++ b/.trinity/seals/race_igla-race-cordic-top.json @@ -1,11 +1,11 @@ { - "gen_hash_c": "sha256:6ccd0730b23b01b22baaa4d88fdd55c1b7f2432e6705cfa16d866043867fdcc3", + "gen_hash_c": "sha256:8da6c11332f9b6fb77045a55f932530eac9662b09bca5d8d772162356ee08e9b", "gen_hash_rust": "sha256:a66f0deeef9a4e00e9a069be0be4a0d34ef62df1040e07ceb4a856599dfbf14f", "gen_hash_verilog": "sha256:a437512ebb999e2fe6a77f6cef3881f33c2d335b97e4f4b7655b9fa0acf5bcf4", "gen_hash_zig": "sha256:665a91db3a756f2f7229814a0ef3e9dec7fce319c148b811aeb07b050c1d1d2e", "module": "igla-race-cordic-top", "ring": 12, - "sealed_at": "2026-09-08T11:16:07Z", + "sealed_at": "2026-09-08T13:02:06Z", "sealed_by": "t27c-bootstrap@0.2.0", "spec_hash": "sha256:a3927bcab311e42d982b0667bf8b946da6c1bdb147d65a24985997700486ee36", "spec_path": "specs/igla/race/cordic_top.t27" diff --git a/.trinity/seals/race_igla-race-formal.json b/.trinity/seals/race_igla-race-formal.json index 1bd45743f..aed499541 100644 --- a/.trinity/seals/race_igla-race-formal.json +++ b/.trinity/seals/race_igla-race-formal.json @@ -1,11 +1,11 @@ { - "gen_hash_c": "sha256:cb3dcb775a85ca093608697069c1e01913dede3ff7ee8f13461e9454821e80b1", + "gen_hash_c": "sha256:2392c1f87c5e4fedb17610394f9d237ef9d46f026394dd1e589b98df66612dd3", "gen_hash_rust": "sha256:76a75680c7ec27fd3ec66cf2e6c4e8a63c6306f0fdded4402ed0260737b2f7f9", "gen_hash_verilog": "sha256:c42bd135a1cb4345d85f79513fc7bcf157387d7ccde398f40007e9f2a54db3ea", "gen_hash_zig": "sha256:d8057987114e327da5de81113ec6e7759edd33a5c29f70cfef8ef0cd17df2dbc", "module": "igla-race-formal", "ring": 12, - "sealed_at": "2026-09-08T12:14:24Z", + "sealed_at": "2026-09-08T13:02:06Z", "sealed_by": "t27c-bootstrap@0.2.0", "spec_hash": "sha256:fbc99bc261c348711aaa19ffb14812698eed8b47ae7e3d64a3922fb7d418ec95", "spec_path": "specs/igla/race/formal.t27" diff --git a/.trinity/seals/race_igla-race-opcodes.json b/.trinity/seals/race_igla-race-opcodes.json index c1fb8e64c..59dec22f5 100644 --- a/.trinity/seals/race_igla-race-opcodes.json +++ b/.trinity/seals/race_igla-race-opcodes.json @@ -1,11 +1,11 @@ { - "gen_hash_c": "sha256:cf189fd8971ff3cc416e2d5527f20905df982d5a159c107d421e77324dd7dba9", + "gen_hash_c": "sha256:a7da2b1229413bca0ef1288e90431416ea378ede4c4f6324cada2e830754c7dd", "gen_hash_rust": "sha256:d29f05f2dbaaa90c1440c58822dedef0ab458180f0a10f18782384321c62cd2e", "gen_hash_verilog": "sha256:43b7278d8492418905df9b42cd7f8656a72caa096a46629f7a3672df6dfaefb6", "gen_hash_zig": "sha256:4e1aa0d12523a5c35ab99c3c59c0ff6217887691b35ea8c7e38b189435f5d7ee", "module": "igla-race-opcodes", "ring": 12, - "sealed_at": "2026-09-08T11:16:07Z", + "sealed_at": "2026-09-08T13:02:06Z", "sealed_by": "t27c-bootstrap@0.2.0", "spec_hash": "sha256:c58958012fcba7b9a9f9ebfe548f1b2531a09944f2865ca33bf6d47c28cc8164", "spec_path": "specs/igla/race/opcodes.t27" diff --git a/.trinity/seals/race_igla-race-rtl.json b/.trinity/seals/race_igla-race-rtl.json index cd687ef03..36b378d8c 100644 --- a/.trinity/seals/race_igla-race-rtl.json +++ b/.trinity/seals/race_igla-race-rtl.json @@ -1,11 +1,11 @@ { - "gen_hash_c": "sha256:1945661a496c2167d83ab69a59aa4b20003bc5c7b3c6da77ffa6627b24aa4c14", + "gen_hash_c": "sha256:ef9baccc649f77a9e7a8c930563535eff1a9c00a42703f261fea55e922c3bcce", "gen_hash_rust": "sha256:78753bc84edf9c0715982b590dc8acf77012445af5cba89db256fa7be1e457b6", "gen_hash_verilog": "sha256:d211220b876e0ff3a84b44de3a618dc7a8eeb8e5b6e7a54294fadf371e12af6d", "gen_hash_zig": "sha256:35e90b4869e68454c87458f55510d22690aaa056d3069c218b9a797a693d4059", "module": "igla-race-rtl", "ring": 12, - "sealed_at": "2026-09-08T12:36:52Z", + "sealed_at": "2026-09-08T13:02:06Z", "sealed_by": "t27c-bootstrap@0.2.0", "spec_hash": "sha256:d062a67d5cea57f6533fdc506780b589c98ff079f673b59676d7062dc3ae2b56", "spec_path": "specs/igla/race/rtl.t27" diff --git a/.trinity/seals/race_igla-race-systolic-ternary.json b/.trinity/seals/race_igla-race-systolic-ternary.json index a18b1d24a..742012302 100644 --- a/.trinity/seals/race_igla-race-systolic-ternary.json +++ b/.trinity/seals/race_igla-race-systolic-ternary.json @@ -1,11 +1,11 @@ { - "gen_hash_c": "sha256:c68788ca89009e6a9e41ca21335ff9c5a6f66692e2988adf008579b461126f93", + "gen_hash_c": "sha256:f779b9e3d9a829261e82260cfa25576412530bd1ecbe1a24f2ef6f8fbf52e1d8", "gen_hash_rust": "sha256:d2c42538400712e3433486cc8c1ff39d983227d7785bc46b558cd21df529775e", "gen_hash_verilog": "sha256:b9bcc018dfb005af4eeb5b89869c35c8c5310e552b9651b1632ab9b5d6c04715", "gen_hash_zig": "sha256:435d75487719ea49559638056c31d9ed7e96f2308530aa45fd8eab1167f7abe8", "module": "igla-race-systolic-ternary", "ring": 12, - "sealed_at": "2026-09-08T11:16:08Z", + "sealed_at": "2026-09-08T13:02:06Z", "sealed_by": "t27c-bootstrap@0.2.0", "spec_hash": "sha256:f0bde5c8a46118437ac641eb8b8f07055679070e32525e50e96e7c90a4baa61b", "spec_path": "specs/igla/race/systolic_ternary.t27" diff --git a/.trinity/seals/race_igla-race-ternary-dot-sw.json b/.trinity/seals/race_igla-race-ternary-dot-sw.json index aec0923b1..878ec2dee 100644 --- a/.trinity/seals/race_igla-race-ternary-dot-sw.json +++ b/.trinity/seals/race_igla-race-ternary-dot-sw.json @@ -1,11 +1,11 @@ { - "gen_hash_c": "sha256:e2ec5b2485e7bd8bdb531ee0cfcc0a5336b5dcedad4e1bf43dfed5a1cec6c414", + "gen_hash_c": "sha256:b115b7aa435bf47a03e83bbf8fbffee378f5ed6f1f8bdfad3aa0968b256c5fca", "gen_hash_rust": "sha256:1df4da3d70d612e7cfa8445dfbc8eeafbc8cb5f6c482a0055fbfc2a583745d26", "gen_hash_verilog": "sha256:67020e89dacb3b31e5b17fdf79d8b032131a1d74964886c2e51700e05677bd9a", "gen_hash_zig": "sha256:9ccb3f4be33392ab07fe1caf6e614a147ade4b7829e6db5e00eae9f81a8a1627", "module": "igla-race-ternary-dot-sw", "ring": 12, - "sealed_at": "2026-09-08T04:57:59Z", + "sealed_at": "2026-09-08T13:02:06Z", "sealed_by": "t27c-bootstrap@0.2.0", "spec_hash": "sha256:5bf4a9567cd56ec9b8862707948c207bba85498d272b73b0fc53e20aa548cbb7", "spec_path": "specs/igla/race/ternary_dot_sw.t27" diff --git a/.trinity/seals/race_igla-race-ternary-gemm.json b/.trinity/seals/race_igla-race-ternary-gemm.json index 349b387ad..e71fc3def 100644 --- a/.trinity/seals/race_igla-race-ternary-gemm.json +++ b/.trinity/seals/race_igla-race-ternary-gemm.json @@ -1,11 +1,11 @@ { - "gen_hash_c": "sha256:8894e421bd421400565db5cc7ef4b3e8ee9e19d22c33e2b85648ff90db9cbb18", + "gen_hash_c": "sha256:5c16474ecc08e7218916ec848842871c7fc21b248e68ba0ff2357a86d2b627fb", "gen_hash_rust": "sha256:1d8f66f4e324e827217ba1b26f0a083e04aa6cf2faf2a9caff7782a65d2c1c0c", "gen_hash_verilog": "sha256:bdb73e5382e4a52ed2f2fec2619aa768e115d4d9e4df373520e8ef0049e38470", "gen_hash_zig": "sha256:dabc60068edb4514e6c8cf8ad09e23cce706b903b09616924416a63f9f04ccab", "module": "igla-race-ternary-gemm", "ring": 12, - "sealed_at": "2026-09-08T11:16:08Z", + "sealed_at": "2026-09-08T13:02:06Z", "sealed_by": "t27c-bootstrap@0.2.0", "spec_hash": "sha256:607d9e99f30688eb84635aa46ad305d3a08ee9fba01b2e0ec7a093276bcad285", "spec_path": "specs/igla/race/ternary_gemm.t27" diff --git a/.trinity/seals/race_igla-race-ternary-mac.json b/.trinity/seals/race_igla-race-ternary-mac.json index 0b8a7ae31..341b479e3 100644 --- a/.trinity/seals/race_igla-race-ternary-mac.json +++ b/.trinity/seals/race_igla-race-ternary-mac.json @@ -1,11 +1,11 @@ { - "gen_hash_c": "sha256:17724be48d60447207b5d80a24ca48e87193ce3a9564723388f8b93d649c50f4", + "gen_hash_c": "sha256:6e4e68604211b00cb7715d8d8e3577d080d25a8a1cd597e58fa89ef2bbdca3b7", "gen_hash_rust": "sha256:d215bd4f9f9ebe78558c5cbe0589883c932f6e06cdecdf458d4da5bd14888d34", "gen_hash_verilog": "sha256:4f0d60eb2df8b3cdfa5c6f7ab33491ab2bc1646ffff732c60ff208e9c823f71e", "gen_hash_zig": "sha256:9671429e06b3debe92707196107ac082824097bfffc9f370b9ff10fee0e534fd", "module": "igla-race-ternary-mac", "ring": 12, - "sealed_at": "2026-09-08T11:16:08Z", + "sealed_at": "2026-09-08T13:02:07Z", "sealed_by": "t27c-bootstrap@0.2.0", "spec_hash": "sha256:c14549c69c9de5701d69e87b5201937a9e667c5b45999d877656e9e42f67bb3f", "spec_path": "specs/igla/race/ternary_mac.t27" diff --git a/.trinity/seals/race_igla-race-yosys.json b/.trinity/seals/race_igla-race-yosys.json index cdee18974..72157ec57 100644 --- a/.trinity/seals/race_igla-race-yosys.json +++ b/.trinity/seals/race_igla-race-yosys.json @@ -1,11 +1,11 @@ { - "gen_hash_c": "sha256:04064359f0d2f1e401c91c005b1283cfe77a83702e307f263ae855bc399c46d4", + "gen_hash_c": "sha256:e992b938503579674c717ac5a3ebef993ae86ceb3eccce46da5312800c36efe1", "gen_hash_rust": "sha256:902e4fda0e6b2fa1a46877da0a6d6d7568619b05f3c4d0c30e72cd12bde7b24d", "gen_hash_verilog": "sha256:824a0d62f756931a5711d0d94d822a09ea2b2b7a1f39ff2e5a83fd32b8ecac6d", "gen_hash_zig": "sha256:fc5e0cab1d1a52085b720bcda46524531936a5e04a755bf9eb0b5379d8006476", "module": "igla-race-yosys", "ring": 12, - "sealed_at": "2026-09-08T12:14:24Z", + "sealed_at": "2026-09-08T13:02:07Z", "sealed_by": "t27c-bootstrap@0.2.0", "spec_hash": "sha256:1c2c4ed75fb636b5111a9da51fa55a1fa03fc689daab0159c3d2dfce66984c99", "spec_path": "specs/igla/race/yosys.t27" diff --git a/bootstrap/src/compiler.rs b/bootstrap/src/compiler.rs index ee8b91dd1..e61a06560 100644 --- a/bootstrap/src/compiler.rs +++ b/bootstrap/src/compiler.rs @@ -18129,6 +18129,9 @@ pub struct CCodegen { /// C struct typedef name of the current function's [T; N] return type, /// so a returned array literal can be cast to the right compound literal. current_ret_array_type: Option, + /// Type names this module actually DECLARES: structs and enums. A lowering + /// that names a type is only safe if the header carries that type. + c_declared_type_names: std::collections::HashSet, /// (struct, field) -> the field's t27 type. A struct-literal field whose /// declared type is a slice takes the compound-literal cast, exactly as a /// call argument does; without it a brace list initialises a pointer. @@ -18165,6 +18168,7 @@ impl CCodegen { scaffold_locals_c: std::collections::HashMap::new(), current_ret_tuple_type: None, current_ret_array_type: None, + c_declared_type_names: std::collections::HashSet::new(), c_struct_field_types: std::collections::HashMap::new(), c_in_return: false, string_typed_names: std::collections::HashSet::new(), @@ -18719,6 +18723,7 @@ impl CCodegen { // forms have to be recognised wherever they appear. for e in &enums { if !e.name.is_empty() { + self.c_declared_type_names.insert(e.name.clone()); let vs = e .children .iter() @@ -18764,6 +18769,9 @@ impl CCodegen { for s in &structs { self.write_line(&format!("typedef struct {} {};", s.name, s.name)); } + for st in &structs { + self.c_declared_type_names.insert(st.name.clone()); + } // Recorded whether or not the cast is ever needed, because a // struct-literal field is written far from its declaration. for st in &structs { @@ -20375,6 +20383,42 @@ impl CCodegen { } else { self.write(&format!("int {}", node.name)); } + } else if raw_type.is_empty() + && node.children.first().is_some_and(|c| { + // An EMPTY slice literal that names its element type. + // `var d = []u8{}` reaches C as `__auto_type d = { 0 }` + // -- the type thrown away AND the length changed from + // zero to one. 478 of these in the specs, the largest + // shape left in the `__auto_type` class. + c.kind == NodeKind::ExprArrayLiteral + && c.children.is_empty() + && c.extra_size.trim().is_empty() + && !c.extra_type.trim().is_empty() + // ...AND the element type is one C will know. The + // first version trusted the spec: `[]u1{}` became + // `u1* a = NULL` and `[]Port{}` became `Port*` + // where no `Port` is declared anywhere -- two files + // got WORSE, trading one diagnostic for two. A + // lowering that names a type must check the header + // carries it. + && { + let e = c.extra_type.trim(); + Self::type_to_c(e) != e || self.c_declared_type_names.contains(e) + } + }) + { + // A slice is a pointer everywhere else in this backend, so + // an empty one is a null pointer -- which is also the only + // honest length. `T x[0]` is not ISO C, and `T x[1] = {0}` + // would answer a question about emptiness with a one. + let lit = node.children.first().unwrap(); + let c_ty = Self::param_type_to_c(&format!("[]{}", lit.extra_type.trim())); + self.write(&format!("{} {} = NULL", c_ty, node.name)); + // The initialiser is written HERE and the shared tail is + // skipped: the literal it would emit is the `{ 0 }` this + // branch exists to replace. + self.write_line(";"); + return; } else if raw_type.is_empty() && node .children diff --git a/bootstrap/stage0/FROZEN_HASH b/bootstrap/stage0/FROZEN_HASH index 8cdb43a17..0a5236d03 100644 --- a/bootstrap/stage0/FROZEN_HASH +++ b/bootstrap/stage0/FROZEN_HASH @@ -1 +1 @@ -bd400b48d2e207a781406e171fcecd142559ff12051a6e7574b9e41073c1fb27 bootstrap/src/compiler.rs +9d6cece78fd25a8c7e9cdec6dcb476dbecfb74ad6e912bc848094ae9e5396d25 bootstrap/src/compiler.rs diff --git a/bootstrap/tests/c_empty_slice_literal.rs b/bootstrap/tests/c_empty_slice_literal.rs new file mode 100644 index 000000000..f9cb2cc25 --- /dev/null +++ b/bootstrap/tests/c_empty_slice_literal.rs @@ -0,0 +1,131 @@ +//! `var d = []u8{}` names its element type, and C was throwing it away. +//! +//! The empty slice literal reached C as `__auto_type d = { 0 }` -- the type +//! discarded AND the length changed from zero to one. **478 of these in the +//! specs**, the largest shape left in the `__auto_type` class. +//! +//! A slice is a pointer everywhere else in this backend, so an empty one is a +//! null pointer, which is also the only honest length: `T x[0]` is not ISO C, +//! and `T x[1] = {0}` would answer a question about emptiness with a one. +//! +//! THE ELEMENT TYPE MUST BE ONE C WILL KNOW. The first version trusted the +//! spec and emitted `u1* a = NULL` and `Port* ports = NULL` where no `u1` and +//! no `Port` are declared anywhere -- **two files got WORSE**, trading one +//! diagnostic for two. A lowering that names a type has to check the header +//! carries it. + +use std::process::Command; +use std::sync::atomic::{AtomicUsize, Ordering}; + +static N: AtomicUsize = AtomicUsize::new(0); + +fn cc_present() -> bool { + Command::new("cc").arg("--version").output().map(|o| o.status.success()).unwrap_or(false) +} + +fn gen_c(spec: &str, tag: &str) -> (String, std::path::PathBuf) { + let d = std::env::temp_dir().join(format!( + "t27c-emptyslice-{tag}-{}-{}", + std::process::id(), + N.fetch_add(1, Ordering::Relaxed) + )); + let _ = std::fs::remove_dir_all(&d); + std::fs::create_dir_all(&d).expect("dir"); + let p = d.join("in.t27"); + std::fs::write(&p, spec).expect("write"); + let out = Command::new(env!("CARGO_BIN_EXE_t27c")) + .arg("gen-c") + .arg(&p) + .output() + .expect("t27c"); + assert!(out.status.success(), "gen-c failed: {}", String::from_utf8_lossy(&out.stderr)); + let h = String::from_utf8_lossy(&out.stdout).to_string(); + assert!(!h.is_empty(), "gen-c produced an EMPTY header"); + (h, d) +} + +fn errors(h: &str, d: &std::path::Path) -> usize { + let p = d.join("h.h"); + std::fs::write(&p, h).expect("write"); + let out = Command::new("cc") + .args(["-std=c11", "-ferror-limit=0", "-fsyntax-only", "-x", "c"]) + .arg(&p) + .output() + .expect("cc"); + String::from_utf8_lossy(&out.stderr) + .lines() + .filter(|l| { + let mut it = l.splitn(4, ':'); + it.next().is_some() + && it.next().map_or(false, |s| s.trim().parse::().is_ok()) + && it.next().map_or(false, |s| s.trim().parse::().is_ok()) + && it.next().map_or(false, |s| s.trim_start().starts_with("error: ")) + }) + .count() +} + +#[test] +fn an_empty_slice_of_a_primitive_is_a_typed_null() { + let (h, d) = gen_c( + "module E {\n fn f(v: i32) -> u32 { var d = []u8{}; return 0; }\n}\n", + "prim", + ); + assert!(h.contains("uint8_t* d = NULL;"), "got:\n{h}"); + assert!(!h.contains("__auto_type d"), "the type was on the literal all along:\n{h}"); + if cc_present() { + assert_eq!(errors(&h, &d), 0, "and it must compile:\n{h}"); + } +} + +#[test] +fn an_empty_slice_of_a_declared_struct_is_allowed() { + let (h, d) = gen_c( + "module E {\n struct Sample { x : i32, }\n fn f(v: i32) -> u32 { var d = []Sample{}; return 0; }\n}\n", + "struct", + ); + assert!(h.contains("Sample* d = NULL;"), "got:\n{h}"); + if cc_present() { + assert_eq!(errors(&h, &d), 0, "and it must compile:\n{h}"); + } +} + +#[test] +fn an_element_type_the_header_does_not_declare_is_refused() { + // THE DISCRIMINATING CASE, and the reason two files got worse before it + // existed. `u1` is not a C type and this module declares none, so naming it + // trades one diagnostic for two. The loud `__auto_type` stays. + let (h, _d) = gen_c( + "module E {\n fn f(v: i32) -> u32 { var a = []u1{}; return 0; }\n}\n", + "unknown", + ); + assert!(!h.contains("u1* a = NULL"), "an unknown element type must be refused:\n{h}"); + assert!(h.contains("__auto_type a"), "and the site stays as it was:\n{h}"); +} + +#[test] +fn an_undeclared_struct_element_is_refused_too() { + // The other half of the same check: a NAME that looks like a type but which + // this module never declares. `Port` in the corpus is exactly this -- only + // `PortMap` exists. + let (h, _d) = gen_c( + "module E {\n struct PortMap { x : i32, }\n fn f(v: i32) -> u32 { var p = []Port{}; return 0; }\n}\n", + "undeclared", + ); + assert!(!h.contains("Port* p = NULL"), "an undeclared struct must be refused:\n{h}"); + assert!(h.contains("__auto_type p"), "and the site stays as it was:\n{h}"); +} + +#[test] +fn a_non_empty_slice_literal_still_becomes_an_array() { + // The branch is for the EMPTY case only; the populated one already had an + // answer and must keep it. + let (h, d) = gen_c( + "module E {\n fn f(v: i32) -> u32 { var e = []i16{ 1, 2 }; return 0; }\n}\n", + "nonempty", + ); + assert!(h.contains("int16_t e[2] = { 1, 2 };"), "got:\n{h}"); + assert!(!h.contains("int16_t* e = NULL"), "a populated literal is not a null:\n{h}"); + if cc_present() { + assert_eq!(errors(&h, &d), 0, "and it must compile:\n{h}"); + } +} diff --git a/docs/now/2026-09-08-the-empty-literal-knew-its-type.md b/docs/now/2026-09-08-the-empty-literal-knew-its-type.md new file mode 100644 index 000000000..036c02521 --- /dev/null +++ b/docs/now/2026-09-08-the-empty-literal-knew-its-type.md @@ -0,0 +1,10 @@ +# NOW -- The empty literal knew its type (2026-09-08) + +## The empty literal knew its type (Closes #3495) + +- `cannot use '__auto_type' with initializer list` was **590 diagnostics over 590 lines** -- ratio 1.00, every one its own site. Splitting the initialiser bodies: **282 are `{ 0 }`**, 82 are `cast_i8(...)` calls (#3464), 82 are enum constants, 36 the repeat form, 11 string literals. +- **The largest shape is not type-less at all.** The source is `var data = []u8{}` -- the Zig empty-slice spelling, which NAMES its element type -- and the emitter threw it away, writing `__auto_type data = { 0 }`: the type discarded and the length changed from zero to one. **478 `[]T{}` literals in the specs** (`[]f32{}` 80, `[]i8{}` 45, `[]u8{}` 43, `[]TernaryWeight{}` 42). The condition that skipped them says so in its own comment: it requires non-empty children or a non-empty `extra_size`, which is exactly false here. +- A slice is a pointer everywhere else in this backend, so an empty one is a **null pointer** -- also the only honest length. `T x[0]` is not ISO C, and `T x[1] = { 0 }` would answer a question about emptiness with a one. +- **THE ELEMENT TYPE HAS TO BE ONE C WILL KNOW, and the first version did not check.** It emitted `u1* a = NULL` and `Port* ports = NULL` where no `u1` and no `Port` are declared anywhere -- **two files got WORSE**, each trading one diagnostic for two, because C parses `Port * ports` as a multiplication and calls `ports` undeclared. The branch now requires the element type to map to a C primitive or to name a struct or enum this module declares. With the check: **19 files better, 0 worse.** +- Errors **11 191 -> 11 042**, the class **590 -> 385**, 230 `T* x = NULL;` emitted. `igla_race_ternary_mac` 118 -> 94, `igla_race_ternary_dot_sw` 38 -> 14. +- What is left of the class is 385, and the two decidable shapes are small and now cheap: **82 lists of enum constants** (`c_enum_constant` already resolves them) and **11 of string literals**. The 82 `cast_i8(...)` lists wait on #3464.