From 02b068e279645285bfa2e4cc43ae57fe119dc24c Mon Sep 17 00:00:00 2001 From: Noam Cohen Date: Mon, 28 Sep 2026 17:35:22 +0200 Subject: [PATCH 1/7] update naja --- thirdparty/naja | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/thirdparty/naja b/thirdparty/naja index 1d33c24c..d3b54987 160000 --- a/thirdparty/naja +++ b/thirdparty/naja @@ -1 +1 @@ -Subproject commit 1d33c24c408f975aac901dc91cf316e02fe6dc82 +Subproject commit d3b549876f65a65aff31b44aa3f51ae60325572e From 036f6491864f9769c45a9ce48c88bb68a316a364 Mon Sep 17 00:00:00 2001 From: Noam Cohen Date: Mon, 28 Sep 2026 17:47:50 +0200 Subject: [PATCH 2/7] update naja --- thirdparty/naja | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/thirdparty/naja b/thirdparty/naja index d3b54987..38a7a4cc 160000 --- a/thirdparty/naja +++ b/thirdparty/naja @@ -1 +1 @@ -Subproject commit d3b549876f65a65aff31b44aa3f51ae60325572e +Subproject commit 38a7a4cc1eb68e6dc7ee4a6b516c62765d3ee33d From b1d177cf388d8a34df72e42af361a92763d022ff Mon Sep 17 00:00:00 2001 From: Noam Cohen Date: Mon, 28 Sep 2026 19:38:18 +0200 Subject: [PATCH 3/7] Build test tops as standard designs for the naja update Naja now rejects creating an SNLInstance inside a primitive design. The miter and scope extraction tests built their top designs as primitives in the primitives library and instantiated gates in them, so 18 tests threw during netlist construction. Create the tops as standard designs in a standard library and keep only the leaf models as primitives. Co-Authored-By: Claude Fable 5.1 --- test/scope/ScopeExtractionTests.cpp | 35 +++++++++++---- test/strategies/miter/MiterTests.cpp | 65 ++++++++++++++++++++++------ 2 files changed, 79 insertions(+), 21 deletions(-) diff --git a/test/scope/ScopeExtractionTests.cpp b/test/scope/ScopeExtractionTests.cpp index 0c0c25b2..2022b4e5 100644 --- a/test/scope/ScopeExtractionTests.cpp +++ b/test/scope/ScopeExtractionTests.cpp @@ -60,6 +60,14 @@ static NLLibrary* createUniverseAndLibrary(NLUniverse*& outUniv) { return lib; } +// Utility: create the standard library holding the top designs. Instances +// cannot be created inside primitive designs, so tops live here while their +// leaf models stay in the primitives library. +static NLLibrary* createDesignsLibrary(NLLibrary* primitives) { + return NLLibrary::create(primitives->getDB(), NLLibrary::Type::Standard, + NLName("designs")); +} + // Build a simple top design with two child instances and two outputs. // The function returns the top design pointer and also fills the instance // pointers and term pointers so tests can wire nets differently to create @@ -79,7 +87,8 @@ struct TopDesignBundle { SNLScalarTerm* childB_out = nullptr; }; -static TopDesignBundle buildSimpleTop(NLLibrary* lib, +static TopDesignBundle buildSimpleTop(NLLibrary* designs, + NLLibrary* lib, const std::string& topBaseName, const std::string& childANameBase, const std::string& childBNameBase) { @@ -91,7 +100,8 @@ static TopDesignBundle buildSimpleTop(NLLibrary* lib, TopDesignBundle b; // Create top - b.top = SNLDesign::create(lib, SNLDesign::Type::Primitive, NLName(topName)); + b.top = + SNLDesign::create(designs, SNLDesign::Type::Standard, NLName(topName)); // two top outputs b.topOutA = SNLScalarTerm::create(b.top, SNLTerm::Direction::Output, NLName("outA")); @@ -126,6 +136,7 @@ class ScopeExtractionUnitTests : public ::testing::Test { void SetUp() override { // create universe + library for each test lib_ = createUniverseAndLibrary(univ_); + designs_ = createDesignsLibrary(lib_); } void TearDown() override { @@ -133,10 +144,12 @@ class ScopeExtractionUnitTests : public ::testing::Test { NLUniverse::get()->destroy(); univ_ = nullptr; lib_ = nullptr; + designs_ = nullptr; } NLUniverse* univ_ = nullptr; NLLibrary* lib_ = nullptr; + NLLibrary* designs_ = nullptr; }; // Test case: identical designs should not be added to designsToVerify_ at the @@ -144,8 +157,10 @@ class ScopeExtractionUnitTests : public ::testing::Test { // identical). TEST_F(ScopeExtractionUnitTests, IdenticalDesigns_NoVerificationNeeded) { // Build two top designs with identical structure (unique names internally) - TopDesignBundle a = buildSimpleTop(lib_, "topA", "LOGIC0", "LOGIC1"); - TopDesignBundle b = buildSimpleTop(lib_, "topB", "LOGIC0", "LOGIC1"); + TopDesignBundle a = + buildSimpleTop(designs_, lib_, "topA", "LOGIC0", "LOGIC1"); + TopDesignBundle b = + buildSimpleTop(designs_, lib_, "topB", "LOGIC0", "LOGIC1"); // Make the child models have deterministic truth tables so library tables // exist @@ -184,7 +199,8 @@ TEST_F(ScopeExtractionUnitTests, IdenticalDesigns_NoVerificationNeeded) { // added TEST_F(ScopeExtractionUnitTests, DifferentInstanceCount_TopAddedToVerify) { // Build top A with two children - TopDesignBundle a = buildSimpleTop(lib_, "topA_diff", "LOGIC0", "LOGIC1"); + TopDesignBundle a = + buildSimpleTop(designs_, lib_, "topA_diff", "LOGIC0", "LOGIC1"); // Build top B with only one child (simulate different instance count) TopDesignBundle b; @@ -192,7 +208,8 @@ TEST_F(ScopeExtractionUnitTests, DifferentInstanceCount_TopAddedToVerify) { ++localCounter; const std::string topBName = std::string("topB_diff_") + std::to_string(localCounter); - b.top = SNLDesign::create(lib_, SNLDesign::Type::Primitive, NLName(topBName)); + b.top = SNLDesign::create(designs_, SNLDesign::Type::Standard, + NLName(topBName)); b.topOutA = SNLScalarTerm::create(b.top, SNLTerm::Direction::Output, NLName("outA")); // create only one child model and instance (unique name) @@ -244,8 +261,10 @@ TEST_F(ScopeExtractionUnitTests, DifferentInstanceCount_TopAddedToVerify) { // the second top as well. TEST_F(ScopeExtractionUnitTests, SameCountDifferentChildIDs_AddedToVerify) { // Build two tops with same number of instances but different child model IDs - TopDesignBundle a = buildSimpleTop(lib_, "topA_ids", "LOGIC_A", "LOGIC_B"); - TopDesignBundle b = buildSimpleTop(lib_, "topB_ids", "LOGIC_X", "LOGIC_Y"); + TopDesignBundle a = + buildSimpleTop(designs_, lib_, "topA_ids", "LOGIC_A", "LOGIC_B"); + TopDesignBundle b = + buildSimpleTop(designs_, lib_, "topB_ids", "LOGIC_X", "LOGIC_Y"); // Set truth tables so nets/terms exist SNLDesignModeling::setTruthTable(a.childA_model, SNLTruthTable(0, 0, SNLTruthTable::fullDependencies(0))); diff --git a/test/strategies/miter/MiterTests.cpp b/test/strategies/miter/MiterTests.cpp index 71427900..628c2266 100644 --- a/test/strategies/miter/MiterTests.cpp +++ b/test/strategies/miter/MiterTests.cpp @@ -265,6 +265,8 @@ void expectGenericGateMiterEquivalent(const char* gateName, NLDB* db = NLDB::create(univ); NLLibrary* library = NLLibrary::create(db, NLLibrary::Type::Primitives, NLName("nangate45")); + NLLibrary* libraryDesigns = + NLLibrary::create(db, NLLibrary::Type::Standard, NLName("designs")); NLDB0::GateType gateType = NLDB0::GateType::And; switch (genericType) { @@ -297,7 +299,8 @@ void expectGenericGateMiterEquivalent(const char* gateName, auto buildTop = [&](const char* topName) { auto top = - SNLDesign::create(library, SNLDesign::Type::Primitive, NLName(topName)); + SNLDesign::create(libraryDesigns, SNLDesign::Type::Standard, + NLName(topName)); auto topIn0 = SNLScalarTerm::create(top, SNLTerm::Direction::Input, NLName("a")); auto topIn1 = @@ -331,6 +334,8 @@ void expectTableSelectMiterEquivalentToMuxTree() { NLDB* db = NLDB::create(univ); NLLibrary* library = NLLibrary::create(db, NLLibrary::Type::Primitives, NLName("nangate45")); + NLLibrary* libraryDesigns = + NLLibrary::create(db, NLLibrary::Type::Standard, NLName("designs")); NLDB0::TableSelectSignature signature; signature.width = 1; @@ -343,7 +348,8 @@ void expectTableSelectMiterEquivalentToMuxTree() { auto buildTop = [&](const char* topName, bool useTableSelect) { auto* top = - SNLDesign::create(library, SNLDesign::Type::Primitive, NLName(topName)); + SNLDesign::create(libraryDesigns, SNLDesign::Type::Standard, + NLName(topName)); auto* data = SNLBusTerm::create(top, SNLTerm::Direction::Input, 7, 0, NLName("d")); auto* addr = @@ -538,9 +544,12 @@ TEST_F(MiterTests, TestMiterAND) { NLDB* db = NLDB::create(univ); NLLibrary* library = NLLibrary::create(db, NLLibrary::Type::Primitives, NLName("nangate45")); + NLLibrary* libraryDesigns = + NLLibrary::create(db, NLLibrary::Type::Standard, NLName("designs")); // 2. Create a top model with one output SNLDesign* top = - SNLDesign::create(library, SNLDesign::Type::Primitive, NLName("top")); + SNLDesign::create(libraryDesigns, SNLDesign::Type::Standard, + NLName("top")); univ->setTopDesign(top); auto topOut = SNLScalarTerm::create(top, SNLTerm::Direction::Output, NLName("out")); @@ -662,11 +671,14 @@ TEST_F(MiterTests, TestMiterANDNonConstant) { // 2. Create primitives library and register truth tables NLLibrary* library = NLLibrary::create(db, NLLibrary::Type::Primitives, NLName("nangate45")); + NLLibrary* libraryDesigns = + NLLibrary::create(db, NLLibrary::Type::Standard, NLName("designs")); NLLibraryTruthTables::construct(library); // 3. Create top design with two inputs and two outputs SNLDesign* top = - SNLDesign::create(library, SNLDesign::Type::Primitive, NLName("top")); + SNLDesign::create(libraryDesigns, SNLDesign::Type::Standard, + NLName("top")); univ->setTopDesign(top); auto topOut = SNLScalarTerm::create(top, SNLTerm::Direction::Output, NLName("out")); @@ -778,8 +790,11 @@ TEST_F(MiterTests, BuildPrimaryOutputClausesConstantTrueOutput) { NLDB* db = NLDB::create(univ); NLLibrary* library = NLLibrary::create(db, NLLibrary::Type::Primitives, NLName("nangate45")); + NLLibrary* libraryDesigns = + NLLibrary::create(db, NLLibrary::Type::Standard, NLName("designs")); SNLDesign* top = - SNLDesign::create(library, SNLDesign::Type::Primitive, NLName("top")); + SNLDesign::create(libraryDesigns, SNLDesign::Type::Standard, + NLName("top")); univ->setTopDesign(top); auto topOut = @@ -811,8 +826,11 @@ TEST_F(MiterTests, BuildPrimaryOutputClausesConstantFalseOutput) { NLDB* db = NLDB::create(univ); NLLibrary* library = NLLibrary::create(db, NLLibrary::Type::Primitives, NLName("nangate45")); + NLLibrary* libraryDesigns = + NLLibrary::create(db, NLLibrary::Type::Standard, NLName("designs")); SNLDesign* top = - SNLDesign::create(library, SNLDesign::Type::Primitive, NLName("top")); + SNLDesign::create(libraryDesigns, SNLDesign::Type::Standard, + NLName("top")); univ->setTopDesign(top); auto topOut = @@ -950,8 +968,11 @@ TEST_F(MiterTests, BuildPrimaryOutputClausesUsesFlatDependencyCoordinatesForPOs) NLDB* db = NLDB::create(univ); NLLibrary* library = NLLibrary::create(db, NLLibrary::Type::Primitives, NLName("nangate45")); + NLLibrary* libraryDesigns = + NLLibrary::create(db, NLLibrary::Type::Standard, NLName("designs")); SNLDesign* top = - SNLDesign::create(library, SNLDesign::Type::Primitive, NLName("top")); + SNLDesign::create(libraryDesigns, SNLDesign::Type::Standard, + NLName("top")); univ->setTopDesign(top); auto topIn0 = @@ -1000,8 +1021,11 @@ TEST_F(MiterTests, BuildPrimaryOutputClausesReportsSkippedNoDriverPO) { NLDB* db = NLDB::create(univ); NLLibrary* library = NLLibrary::create(db, NLLibrary::Type::Primitives, NLName("nangate45")); + NLLibrary* libraryDesigns = + NLLibrary::create(db, NLLibrary::Type::Standard, NLName("designs")); SNLDesign* top = - SNLDesign::create(library, SNLDesign::Type::Primitive, NLName("top")); + SNLDesign::create(libraryDesigns, SNLDesign::Type::Standard, + NLName("top")); univ->setTopDesign(top); auto topIn = @@ -1069,8 +1093,11 @@ TEST_F(MiterTests, BuildPrimaryOutputClausesReportsSkippedMultiDriverPO) { NLDB* db = NLDB::create(univ); NLLibrary* library = NLLibrary::create(db, NLLibrary::Type::Primitives, NLName("nangate45")); + NLLibrary* libraryDesigns = + NLLibrary::create(db, NLLibrary::Type::Standard, NLName("designs")); SNLDesign* top = - SNLDesign::create(library, SNLDesign::Type::Primitive, NLName("top")); + SNLDesign::create(libraryDesigns, SNLDesign::Type::Standard, + NLName("top")); univ->setTopDesign(top); auto topIn = @@ -1152,8 +1179,11 @@ TEST_F(MiterTests, BuildPrimaryOutputClausesInitializesSkippedPOReportFilesOnlyO NLDB* db = NLDB::create(univ); NLLibrary* library = NLLibrary::create(db, NLLibrary::Type::Primitives, NLName("nangate45")); + NLLibrary* libraryDesigns = + NLLibrary::create(db, NLLibrary::Type::Standard, NLName("designs")); SNLDesign* top = - SNLDesign::create(library, SNLDesign::Type::Primitive, NLName("top")); + SNLDesign::create(libraryDesigns, SNLDesign::Type::Standard, + NLName("top")); univ->setTopDesign(top); auto topInA = @@ -1436,8 +1466,11 @@ TEST_F(MiterTests, CachedIsoShortcutDoesNotCreateNewMiterInput) { NLDB* db = NLDB::create(univ); NLLibrary* library = NLLibrary::create(db, NLLibrary::Type::Primitives, NLName("nangate45")); + NLLibrary* libraryDesigns = + NLLibrary::create(db, NLLibrary::Type::Standard, NLName("designs")); SNLDesign* top = - SNLDesign::create(library, SNLDesign::Type::Primitive, NLName("top")); + SNLDesign::create(libraryDesigns, SNLDesign::Type::Standard, + NLName("top")); univ->setTopDesign(top); auto topInA = @@ -1620,8 +1653,11 @@ TEST_F(MiterTests, SNLLogicCloudReportsSkippedNoDriverRoot) { NLDB* db = NLDB::create(univ); NLLibrary* library = NLLibrary::create(db, NLLibrary::Type::Primitives, NLName("nangate45")); + NLLibrary* libraryDesigns = + NLLibrary::create(db, NLLibrary::Type::Standard, NLName("designs")); SNLDesign* top = - SNLDesign::create(library, SNLDesign::Type::Primitive, NLName("top")); + SNLDesign::create(libraryDesigns, SNLDesign::Type::Standard, + NLName("top")); univ->setTopDesign(top); auto topIn = @@ -2003,9 +2039,12 @@ TEST_F(MiterTests, TestMiterANDNonConstantWithSequentialElements) { NLDB* db = NLDB::create(univ); NLLibrary* library = NLLibrary::create(db, NLLibrary::Type::Primitives, NLName("nangate45")); + NLLibrary* libraryDesigns = + NLLibrary::create(db, NLLibrary::Type::Standard, NLName("designs")); // 2. Create a top model with one output SNLDesign* top = - SNLDesign::create(library, SNLDesign::Type::Primitive, NLName("top")); + SNLDesign::create(libraryDesigns, SNLDesign::Type::Standard, + NLName("top")); univ->setTopDesign(top); auto topOut = SNLScalarTerm::create(top, SNLTerm::Direction::Output, NLName("out")); From 57969c61bc0dd0354a191ea01489e3f1d7f9206e Mon Sep 17 00:00:00 2001 From: Noam Cohen Date: Mon, 28 Sep 2026 19:59:42 +0200 Subject: [PATCH 4/7] Point naja at main with the shared runtime SDK merged The previous pointer moved to naja main, which did not contain the shared Python runtime SDK commit that lived only on naja's fix7 branch. The Python package build depends on it (najaeda.sdk, NajaPythonRuntimeAPI.h, NLUniverse::getRuntimeIdentity, DNL::exchange). fix7 is now merged into naja main; point at that merge. Co-Authored-By: Claude Fable 5.1 --- thirdparty/naja | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/thirdparty/naja b/thirdparty/naja index 38a7a4cc..caad1f8e 160000 --- a/thirdparty/naja +++ b/thirdparty/naja @@ -1 +1 @@ -Subproject commit 38a7a4cc1eb68e6dc7ee4a6b516c62765d3ee33d +Subproject commit caad1f8e3f37b9cd887d677ce9d5e5715d676d68 From 8fe46f34870ff9a71f7347f5425be12df7d95abb Mon Sep 17 00:00:00 2001 From: Noam Cohen Date: Mon, 28 Sep 2026 20:17:22 +0200 Subject: [PATCH 5/7] Pin the development NajaEDA provider to 0.7.26 from naja main Naja main keeps the upstream 0.7.26 version instead of the outdated 0.7.24.dev0 that came from the fix7 branch. Point the submodule at it and move the development provider pins to match. The development and published providers can now share a version number, so the wheel helper selects the published provider by KEPLER_USE_PUBLISHED_NAJAEDA rather than by a .dev suffix. --- ci/prepare_python_release.py | 2 +- ci/shared_naja_wheels.py | 11 ++++++----- docs/python-api.md | 2 +- docs/python-release.md | 2 +- pyproject.toml | 4 ++-- test/python/test_python_release.py | 10 +++++----- test/python/test_shared_wheel_packaging.py | 3 ++- thirdparty/naja | 2 +- 8 files changed, 19 insertions(+), 17 deletions(-) diff --git a/ci/prepare_python_release.py b/ci/prepare_python_release.py index a39401c4..1e4ccf39 100644 --- a/ci/prepare_python_release.py +++ b/ci/prepare_python_release.py @@ -16,7 +16,7 @@ import re -DEVELOPMENT_REQUIREMENT = "najaeda==0.7.24.dev0" +DEVELOPMENT_REQUIREMENT = "najaeda==0.7.26" PUBLISHED_REQUIREMENT = "najaeda==0.7.24" CMAKE_OPTION = "KEPLER_USE_PUBLISHED_NAJAEDA" VERSION_PATTERN = r'KEPLER_VERSION\s*\{\s*"(?P[0-9]+\.[0-9]+\.[0-9]+)"' diff --git a/ci/shared_naja_wheels.py b/ci/shared_naja_wheels.py index 7c5c9eea..7bdbb209 100644 --- a/ci/shared_naja_wheels.py +++ b/ci/shared_naja_wheels.py @@ -20,10 +20,11 @@ import sys import tempfile -PROVIDER_REQUIREMENT = ( - "najaeda==0.7.24" if os.environ.get("KEPLER_USE_PUBLISHED_NAJAEDA") == "1" - else "najaeda==0.7.24.dev0" -) +# The development provider is built from thirdparty/naja and carries the same +# version number as the NajaEDA release it is based on, so the version alone +# cannot tell the two providers apart. +USE_PUBLISHED_PROVIDER = os.environ.get("KEPLER_USE_PUBLISHED_NAJAEDA") == "1" +PROVIDER_REQUIREMENT = "najaeda==0.7.24" if USE_PUBLISHED_PROVIDER else "najaeda==0.7.26" def run(*arguments: str, env: dict[str, str] | None = None) -> None: @@ -148,7 +149,7 @@ def build_provider(project: Path) -> None: "Windows": "delvewheel"}[platform.system()] run(sys.executable, "-m", "pip", "install", repair_package) destination = project / ".kepler-provider-wheels" - if ".dev" not in PROVIDER_REQUIREMENT: + if USE_PUBLISHED_PROVIDER: # Release consumers must link the exact distributed provider, not a # locally rebuilt same-version runtime with a different native build # identity. Download it for the isolated cibuildwheel test environment. diff --git a/docs/python-api.md b/docs/python-api.md index b09dbb98..3e5cdc80 100644 --- a/docs/python-api.md +++ b/docs/python-api.md @@ -18,7 +18,7 @@ For local regression without wheels or publishing, use the packages from this checkout and tests their shared runtime. The default development build uses the matching NajaEDA shared-runtime SDK, -version `0.7.24.dev0` in `thirdparty/naja`. Build both packages from this +version `0.7.26` in `thirdparty/naja`. Build both packages from this recursive checkout in one virtual environment, with the native build dependencies installed: diff --git a/docs/python-release.md b/docs/python-release.md index e0e44bf8..51b2af33 100644 --- a/docs/python-release.md +++ b/docs/python-release.md @@ -56,7 +56,7 @@ and [GitHub environment protection documentation](https://docs.github.com/en/act After the workflow is present on the repository's default branch, open **Actions → Python wheels → Run workflow**. Leave `publish` unchecked and -`version` empty. These jobs use locally built NajaEDA `0.7.24.dev0` from the +`version` empty. These jobs use locally built NajaEDA `0.7.26` from the pinned submodule and its shared-runtime SDK. The workflow builds, repairs, and tests wheels, then stores them as Actions artifacts. Use this to check a branch before merging. diff --git a/pyproject.toml b/pyproject.toml index 856667c6..135f0a79 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,7 +2,7 @@ # SPDX-License-Identifier: Apache-2.0 [build-system] -requires = ["scikit-build-core>=0.11.3,<0.12", "najaeda==0.7.24.dev0"] +requires = ["scikit-build-core>=0.11.3,<0.12", "najaeda==0.7.26"] build-backend = "scikit_build_core.build" [project] @@ -11,7 +11,7 @@ description = "Native Python interface for Kepler Formal equivalence checking" authors = [{name = "keplertech.io", email = "contact@keplertech.io"}] readme = "src/python/README.rst" requires-python = ">=3.10" -dependencies = ["najaeda==0.7.24.dev0"] +dependencies = ["najaeda==0.7.26"] license = {file = "LICENSE.rst"} dynamic = ["version"] classifiers = [ diff --git a/test/python/test_python_release.py b/test/python/test_python_release.py index 114958d7..398ffe87 100644 --- a/test/python/test_python_release.py +++ b/test/python/test_python_release.py @@ -18,11 +18,11 @@ METADATA = '''# Keep unrelated metadata and commands intact. [build-system] -requires = ["scikit-build-core>=0.11.3,<0.12", "najaeda==0.7.24.dev0"] +requires = ["scikit-build-core>=0.11.3,<0.12", "najaeda==0.7.26"] [project] name = "kepler-formal" -dependencies = ["najaeda==0.7.24.dev0"] +dependencies = ["najaeda==0.7.26"] dynamic = ["version"] [tool.scikit-build.cmake.define] @@ -78,7 +78,7 @@ def test_default_preparation_does_not_modify_checkout(self): def test_published_preparation_changes_only_pins_and_cmake_option(self): release.prepare_project(self.project, published_najaeda=True) - expected = METADATA.replace("najaeda==0.7.24.dev0", "najaeda==0.7.24").replace( + expected = METADATA.replace("najaeda==0.7.26", "najaeda==0.7.24").replace( 'KEPLER_USE_PUBLISHED_NAJAEDA = "OFF"', 'KEPLER_USE_PUBLISHED_NAJAEDA = "ON"') self.assertEqual(expected, self.metadata.read_text(encoding="utf-8")) @@ -92,8 +92,8 @@ def test_published_preparation_adds_missing_cmake_option(self): self.assertEqual("0.5.0", self._validate()) def test_mismatched_or_unsupported_provider_pins_do_not_modify_checkout(self): - for text in (METADATA.replace("najaeda==0.7.24.dev0", "najaeda==0.7.24", 1), - METADATA.replace("najaeda==0.7.24.dev0", "najaeda>=0.7.24")): + for text in (METADATA.replace("najaeda==0.7.26", "najaeda==0.7.24", 1), + METADATA.replace("najaeda==0.7.26", "najaeda>=0.7.24")): with self.subTest(text=text): self.metadata.write_text(text, encoding="utf-8") with self.assertRaisesRegex(ValueError, "supported provider"): diff --git a/test/python/test_shared_wheel_packaging.py b/test/python/test_shared_wheel_packaging.py index 8d81aa50..667fb4cd 100644 --- a/test/python/test_shared_wheel_packaging.py +++ b/test/python/test_shared_wheel_packaging.py @@ -21,7 +21,8 @@ class SharedWheelPackagingTests(unittest.TestCase): def test_release_uses_published_provider_instead_of_rebuilding_it(self): with tempfile.TemporaryDirectory() as temporary: root = Path(temporary) - with patch.object(helper, "PROVIDER_REQUIREMENT", "najaeda==1.2.3"), \ + with patch.object(helper, "USE_PUBLISHED_PROVIDER", True), \ + patch.object(helper, "PROVIDER_REQUIREMENT", "najaeda==1.2.3"), \ patch.object(helper, "run") as run, \ patch.object(helper, "repair") as repair: helper.build_provider(root) diff --git a/thirdparty/naja b/thirdparty/naja index caad1f8e..6331960c 160000 --- a/thirdparty/naja +++ b/thirdparty/naja @@ -1 +1 @@ -Subproject commit caad1f8e3f37b9cd887d677ce9d5e5715d676d68 +Subproject commit 6331960cb372ef6d332d07a42fb449d0bea01bbe From 6c3b69d62e35a008575e8ba3943384886af45814 Mon Sep 17 00:00:00 2001 From: Noam Cohen Date: Mon, 28 Sep 2026 20:47:42 +0200 Subject: [PATCH 6/7] Sync the Bazel pins with naja main Pin naja to the current main, and naja-verilog and slang to the commits naja itself uses. Slang now comes from upstream. Route the new HDL and VHDL libraries through the Naja cc_library wrapper and add their directories to the quote include list. --- bazel/deps.bzl | 14 +++++++------- bazel/naja_ff_scan.patch | 24 ++++++++++++++++++++++++ bazel/naja_includes.bzl | 2 ++ 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/bazel/deps.bzl b/bazel/deps.bzl index 99d67f81..ed65439b 100644 --- a/bazel/deps.bzl +++ b/bazel/deps.bzl @@ -33,10 +33,10 @@ _FLEX_VERSION = "2.6.4" _CADICAL_COMMIT = "7b99c07f0bcab5824a5a3ce62c7066554017f641" _GLUCOSE_COMMIT = "7f887abba7cf13636a5ac2d28653668a20a91b25" _KISSAT_COMMIT = "8af8e56f174b778aef3aa45af9f739b2a5f492c2" -_NAJA_COMMIT = "83be8a9e9fc7683de50c22a91f7352a72b3783dd" -_NAJA_VERILOG_COMMIT = "5da040bb34f0e4e5bb8d67223b999a0132fb401f" +_NAJA_COMMIT = "6331960cb372ef6d332d07a42fb449d0bea01bbe" +_NAJA_VERILOG_COMMIT = "be6544b128e229ce2aee814e795c1e49b02caf5c" _NAJA_IF_COMMIT = "099677d9f52c0db11b12c08d03e32543eebc7888" -_SLANG_COMMIT = "512c327c209d3043aa98ecfd02d06a1b73fcd5fb" +_SLANG_COMMIT = "b60d729d66b9cdeec158b800f898461a138d505e" _TOMLPLUSPLUS_COMMIT = "30172438cee64926dc41fdd9c11fb3ba5b2ba9de" def _deps_impl(_module_ctx): @@ -131,7 +131,7 @@ def _deps_impl(_module_ctx): http_archive( name = "naja-verilog", url = "https://github.com/najaeda/naja-verilog/archive/{}.tar.gz".format(_NAJA_VERILOG_COMMIT), - sha256 = "8a0513378c419afc462ffd59c35c7d0362fee7787ab40ef23b2f0a360df0a9df", + sha256 = "f6fa913e9af19a589fe656bd503f9e1acb1fab11db8a563457513e76113bb003", strip_prefix = "naja-verilog-{}".format(_NAJA_VERILOG_COMMIT), patch_args = ["-p0", "-f"], patches = [Label("//bazel:naja_verilog_bazel9.patch")], @@ -147,8 +147,8 @@ def _deps_impl(_module_ctx): http_archive( name = "slang", - url = "https://github.com/najaeda/slang/archive/{}.tar.gz".format(_SLANG_COMMIT), - sha256 = "144054285e246801a579e1365fe50c4d0a04a188025c8cb2bbe2355f653f2cbd", + url = "https://github.com/MikePopoloski/slang/archive/{}.tar.gz".format(_SLANG_COMMIT), + sha256 = "a9f65590ccf4ff2083b49f0f4352aac53e6458b04b2f1a65e24814aba3a05bc2", strip_prefix = "slang-{}".format(_SLANG_COMMIT), build_file = Label("//bazel:slang.BUILD.bazel"), ) @@ -156,7 +156,7 @@ def _deps_impl(_module_ctx): http_archive( name = "naja", url = "https://github.com/nanocoh/naja/archive/{}.tar.gz".format(_NAJA_COMMIT), - sha256 = "818723897f0db8e19796db9ea7b6af2175ec724253a83e977361b40b92c98f78", + sha256 = "29fb32c3bb91d777bfd1458b5a90858f4979bc075fd2e79fcac63cf16a97c1b2", strip_prefix = "naja-{}".format(_NAJA_COMMIT), build_file = Label("//bazel:naja.BUILD.bazel"), patch_args = ["-p0", "-f"], diff --git a/bazel/naja_ff_scan.patch b/bazel/naja_ff_scan.patch index be0250d5..915dfbb5 100644 --- a/bazel/naja_ff_scan.patch +++ b/bazel/naja_ff_scan.patch @@ -149,3 +149,27 @@ +load("@rules_cc//cc:cc_library.bzl", "cc_library") + # Vendored directly in this repo (not a submodule). naja only ever uses +--- src/nl/formats/hdl/BUILD.bazel ++++ src/nl/formats/hdl/BUILD.bazel +@@ -1,3 +1,5 @@ + # SPDX-License-Identifier: Apache-2.0 + ++load("@kepler-formal//bazel:naja_cc_library.bzl", "cc_library") ++ + cc_library( +--- src/nl/formats/vhdl/BUILD.bazel ++++ src/nl/formats/vhdl/BUILD.bazel +@@ -1,3 +1,5 @@ + # SPDX-License-Identifier: Apache-2.0 + ++load("@kepler-formal//bazel:naja_cc_library.bzl", "cc_library") ++ + cc_library( +--- src/vhdl/BUILD.bazel ++++ src/vhdl/BUILD.bazel +@@ -1,3 +1,5 @@ + # SPDX-License-Identifier: Apache-2.0 + ++load("@kepler-formal//bazel:naja_cc_library.bzl", "cc_library") ++ + cc_library( diff --git a/bazel/naja_includes.bzl b/bazel/naja_includes.bzl index 8c4903d1..8b69188b 100644 --- a/bazel/naja_includes.bzl +++ b/bazel/naja_includes.bzl @@ -25,11 +25,13 @@ _NAJA_QUOTE_INCLUDE_DIRS = [ "src/nl/netlist/pnl", "src/nl/netlist/visual", "src/nl/netlist/serialization/capnp", + "src/nl/formats/hdl", "src/nl/formats/lefdef", "src/nl/formats/liberty", "src/nl/formats/systemverilog/frontend", "src/nl/formats/verilog/backend", "src/nl/formats/verilog/frontend", + "src/nl/formats/vhdl", "src/nl/python/pyloader", "src/optimization", "thirdparty/yosys-liberty/src", From 8bf48991164ea08f5c9616eaf095936b42003933 Mon Sep 17 00:00:00 2001 From: Noam Cohen Date: Mon, 28 Sep 2026 22:55:06 +0200 Subject: [PATCH 7/7] Install Boost.Multiprecision for the Windows wheel build Naja's VHDL frontend includes boost/multiprecision/cpp_int.hpp. The Windows setup installs Boost components individually through vcpkg and did not include it, so the NajaEDA provider wheel failed to build on Windows only. --- ci/windows_setup.ps1 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ci/windows_setup.ps1 b/ci/windows_setup.ps1 index 0a840ebd..eae139cf 100644 --- a/ci/windows_setup.ps1 +++ b/ci/windows_setup.ps1 @@ -24,7 +24,8 @@ Invoke-Checked (Join-Path $keplerVcpkgRoot 'bootstrap-vcpkg.bat') @('-disableMet Invoke-Checked (Join-Path $keplerVcpkgRoot 'vcpkg.exe') @( 'install', '--triplet=x64-windows', 'capnproto', 'tbb', 'zlib', - 'boost-intrusive', 'boost-dynamic-bitset', 'boost-unordered', 'boost-regex' + 'boost-intrusive', 'boost-dynamic-bitset', 'boost-multiprecision', + 'boost-unordered', 'boost-regex' ) # GitHub's Windows image includes LLVM and an MSVC SDK. The LLVM frontend is