diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f13c7b30a..3e3e637c6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -12,8 +12,39 @@ on: release: types: [published] +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: + changes: + name: Check for source changes + runs-on: ubuntu-latest + outputs: + code: ${{ steps.filter.outputs.code == 'true' || github.event_name == 'release' }} + steps: + - uses: actions/checkout@v7 + - uses: dorny/paths-filter@v4 + id: filter + if: github.event_name != 'release' + with: + filters: | + code: + - '!**/*.md' + - '!docs/**' + - '!samples/**' + - '!Jenkinsfile*' + - '!.travis.yml' + - '!dropbox-deployment.yml' + - '!.gitignore' + - '!LICENSE' + - '!COPYRIGHT' + - '!CONTRIB' + - '!Changelog*' + build: + needs: changes + if: needs.changes.outputs.code == 'true' runs-on: ${{ matrix.os }} strategy: fail-fast: false @@ -47,9 +78,7 @@ jobs: haskell: true large-packages: true - uses: hmarr/debug-action@v3 - - name: Cancel Workflow Action - uses: styfle/cancel-workflow-action@0.13.0 - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - name: ccache if: matrix.os != 'ubuntu-24.04-arm' uses: hendrikmuhs/ccache-action@v1.2 @@ -66,7 +95,7 @@ jobs: mkdir -p $HOST_CCACHE_DIR - name: Build wheels (ARM) if: matrix.os == 'ubuntu-24.04-arm' - uses: pypa/cibuildwheel@v3.3.1 + uses: pypa/cibuildwheel@v4.1.1 env: # override the default CentOS “yum install … ccache” and drop ccache CIBW_BEFORE_ALL_LINUX: | @@ -81,7 +110,7 @@ jobs: - name: Build wheels (all other platforms) if: matrix.os != 'ubuntu-24.04-arm' - uses: pypa/cibuildwheel@v3.3.1 + uses: pypa/cibuildwheel@v4.1.1 env: CIBW_BUILD: ${{ matrix.cibuild }} CIBW_ARCHS_MACOS: ${{ matrix.macos-arch }} @@ -98,7 +127,7 @@ jobs: mv ./wheelhouse/.ccache $HOST_CCACHE_DIR ls -la $HOST_CCACHE_DIR ccache -s - - uses: actions/upload-artifact@v6 + - uses: actions/upload-artifact@v7 with: name: artifact-${{ matrix.os }}-${{ matrix.cibw_arch }}-${{ strategy.job-index }} path: ./wheelhouse/*.whl @@ -106,14 +135,16 @@ jobs: # The following was taken from https://cibuildwheel.readthedocs.io/en/stable/deliver-to-pypi/ make_sdist: name: Make SDist + needs: changes + if: needs.changes.outputs.code == 'true' runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - name: Build SDist run: pipx run build --sdist - - uses: actions/upload-artifact@v6 + - uses: actions/upload-artifact@v7 with: name: artifact-sdist path: dist/*.tar.gz @@ -122,12 +153,12 @@ jobs: needs: [build, make_sdist] runs-on: ubuntu-latest steps: - - uses: actions/download-artifact@v7 + - uses: actions/download-artifact@v8 with: merge-multiple: true path: dist - - uses: pypa/gh-action-pypi-publish@v1.13.0 + - uses: pypa/gh-action-pypi-publish@v1.14.2 continue-on-error: true # might fail if we don't bump the version with: user: __token__ @@ -139,12 +170,12 @@ jobs: runs-on: ubuntu-latest if: github.event_name == 'release' && github.event.action == 'published' steps: - - uses: actions/download-artifact@v7 + - uses: actions/download-artifact@v8 with: merge-multiple: true path: dist - - uses: pypa/gh-action-pypi-publish@v1.13.0 + - uses: pypa/gh-action-pypi-publish@v1.14.2 with: user: __token__ password: ${{ secrets.pypi_password }} diff --git a/.github/workflows/cache-maintenance.yml b/.github/workflows/cache-maintenance.yml index f57190c28..8208d0e97 100644 --- a/.github/workflows/cache-maintenance.yml +++ b/.github/workflows/cache-maintenance.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out code - uses: actions/checkout@v6 + uses: actions/checkout@v7 - name: Cleanup run: | diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 1d653e497..000000000 --- a/.travis.yml +++ /dev/null @@ -1,582 +0,0 @@ -branches: - only: - - /v\d+\.\d+(\.\d+)?(\S*)?$/ # tag format: *v0.25(.8)(dev14) - - staging - - master - -matrix: - include: - # python manylinux packages - - name: "cp39-cp39m-manylinux2014_x86_64.whl" - os: linux - sudo: true - language: python - python: '3.9' - services: - - docker - env: - - DOCKER_IMAGE="quay.io/pypa/manylinux2014_x86_64" - - PY_VERSION="cp39-cp39" - - DOCKER_BUILD=true - - TEST_IN_HOST=true - - MATRIX_EVAL="" - cache: - directories: - - ccache - - - name: "cp38-cp38m-manylinux2014_x86_64.whl" - os: linux - sudo: true - language: python - python: '3.8' - services: - - docker - env: - - DOCKER_IMAGE="quay.io/pypa/manylinux2014_x86_64" - - PY_VERSION="cp38-cp38" - - DOCKER_BUILD=true - - TEST_IN_HOST=true - - MATRIX_EVAL="" - cache: - directories: - - ccache - - - name: "cp37-cp37m-manylinux2014_x86_64.whl" - os: linux - sudo: true - language: python - python: '3.7-dev' - services: - - docker - env: - - DOCKER_IMAGE="quay.io/pypa/manylinux2014_x86_64" - - PY_VERSION="cp37-cp37m" - - DOCKER_BUILD=true - - TEST_IN_HOST=true - - MATRIX_EVAL="" - cache: - directories: - - ccache - - - name: "cp36-cp36m-manylinux2014_x86_64.whl" - os: linux - sudo: true - language: python - python: '3.6' - services: - - docker - env: - - DOCKER_IMAGE="quay.io/pypa/manylinux2014_x86_64" - - PY_VERSION="cp36-cp36m" - - DOCKER_BUILD=true - - TEST_IN_HOST=true - - MATRIX_EVAL="" - cache: - directories: - - ccache - - - name: "cp35-cp35m-manylinux2014_x86_64.whl" - os: linux - sudo: true - language: python - python: '3.5' - services: - - docker - env: - - DOCKER_IMAGE="quay.io/pypa/manylinux2014_x86_64" - - PY_VERSION="cp35-cp35m" - - DOCKER_BUILD=true - - TEST_IN_HOST=true - - MATRIX_EVAL="" - cache: - directories: - - ccache - - - name: "cp27-cp27m-manylinux2014_x86_64.whl" - os: linux - sudo: true - language: python - python: '2.7' - services: - - docker - env: - - DOCKER_IMAGE="quay.io/pypa/manylinux2014_x86_64" - - PY_VERSION="cp27-cp27m" - - DOCKER_BUILD=true - - TEST_IN_HOST=false # travis's python 2.7 uses ucs4 (mu), so this test fails. - - MATRIX_EVAL="" - cache: - directories: - - ccache - - # python 3 osx - - # MacOS 10.15 - - # MacOS 10.15, Python 3.9 - - name: "cp39-cp39m-macosx_10_15_x86_64.whl" - os: osx - osx_image: xcode12 # macOS 10.15 - cache: - directories: - - ccache - addons: - homebrew: - packages: - - python@3.9 - - ccache - update: true - env: - - MATRIX_EVAL="shopt -s expand_aliases; alias python='/usr/local/opt/python@3.9/bin/python3'; alias pip='/usr/local/opt/python@3.9/bin/pip3';" - - ARCHFLAGS="-std=c++11" - - PIP_UPDATE="1" - - PYTHON_BUILD=true - - # MacOS 10.15, Python 3.8 - - name: "cp38-cp38m-macosx_10_15_x86_64.whl" - os: osx - osx_image: xcode12 # macOS 10.15 - cache: - directories: - - ccache - addons: - homebrew: - packages: - - python@3.8 - - ccache - update: true - env: - - MATRIX_EVAL="shopt -s expand_aliases; alias python='/usr/local/opt/python@3.8/bin/python3'; alias pip='/usr/local/opt/python@3.8/bin/pip3';" - - ARCHFLAGS="-std=c++11" - - PIP_UPDATE="1" - - PYTHON_BUILD=true - - # MacOS 10.15, Python 3.7 - - name: "cp37-cp37m-macosx_10_15_x86_64.whl" - os: osx - osx_image: xcode12 # macOS 10.15 - cache: - directories: - - ccache - addons: - homebrew: - packages: - - python@3.7 - - ccache - update: true - env: - - MATRIX_EVAL="shopt -s expand_aliases; alias python='/usr/local/opt/python@3.7/bin/python3'; alias pip='/usr/local/opt/python@3.7/bin/pip3';" - - ARCHFLAGS="-std=c++11" - - PIP_UPDATE="1" - - PYTHON_BUILD=true - - # MacOS 10.14 - - # MacOS 10.14, Python 3.9 - - name: "cp39-cp39m-macosx_10_14_x86_64.whl" - os: osx - osx_image: xcode11 # macOS 10.14 - cache: - directories: - - ccache - addons: - homebrew: - packages: - - python@3.9 - - ccache - update: true - env: - - MATRIX_EVAL="shopt -s expand_aliases; alias python='/usr/local/opt/python@3.9/bin/python3'; alias pip='/usr/local/opt/python@3.9/bin/pip3';" - - ARCHFLAGS="-std=c++11" - - PIP_UPDATE="1" - - PYTHON_BUILD=true - - # MacOS 10.14, Python 3.8 - - name: "cp38-cp38m-macosx_10_14_x86_64.whl" - os: osx - osx_image: xcode11 # macOS 10.14 - cache: - directories: - - ccache - addons: - homebrew: - packages: - - python@3.8 - - ccache - update: true - env: - - MATRIX_EVAL="shopt -s expand_aliases; alias python='/usr/local/opt/python@3.8/bin/python3'; alias pip='/usr/local/opt/python@3.8/bin/pip3';" - - ARCHFLAGS="-std=c++11" - - PIP_UPDATE="1" - - PYTHON_BUILD=true - - # MacOS 10.14, Python 3.7 - - name: "cp37-cp37m-macosx_10_14_x86_64.whl" - os: osx - osx_image: xcode11 # macOS 10.14 - cache: - directories: - - ccache - addons: - homebrew: - packages: - - python@3.7 - - ccache - update: true - env: - - MATRIX_EVAL="shopt -s expand_aliases; alias python='/usr/local/opt/python@3.7/bin/python3'; alias pip='/usr/local/opt/python@3.7/bin/pip3';" - - ARCHFLAGS="-std=c++11" - - PIP_UPDATE="1" - - PYTHON_BUILD=true - - # MacOS 10.13 - - # MacOS 10.13, Python 3.9 - - name: "cp39-cp39m-macosx_10_13_x86_64.whl" - os: osx - osx_image: xcode10.1 # macOS 10.13 - cache: - directories: - - ccache - addons: - homebrew: - packages: - - python@3.9 - - ccache - update: true - env: - - MATRIX_EVAL="shopt -s expand_aliases; alias python='/usr/local/opt/python@3.9/bin/python3'; alias pip='/usr/local/opt/python@3.9/bin/pip3';" - - ARCHFLAGS="-std=c++11" - - PIP_UPDATE="1" - - PYTHON_BUILD=true - - # MacOS 10.13, Python 3.8 - - name: "cp38-cp38m-macosx_10_13_x86_64.whl" - os: osx - osx_image: xcode10.1 # macOS 10.13 - cache: - directories: - - ccache - addons: - homebrew: - packages: - - python@3.8 - - ccache - update: true - env: - - MATRIX_EVAL="shopt -s expand_aliases; alias python='/usr/local/opt/python@3.8/bin/python3'; alias pip='/usr/local/opt/python@3.8/bin/pip3';" - - ARCHFLAGS="-std=c++11" - - PIP_UPDATE="1" - - PYTHON_BUILD=true - - # MacOS 10.13, Python 3.7 - - name: "cp37-cp37m-macosx_10_13_x86_64.whl" - os: osx - osx_image: xcode10.1 # macOS 10.13 - cache: - directories: - - ccache - addons: - homebrew: - packages: - - python@3.7 - - ccache - update: true - env: - - MATRIX_EVAL="shopt -s expand_aliases; alias python='/usr/local/opt/python@3.7/bin/python3'; alias pip='/usr/local/opt/python@3.7/bin/pip3';" - - ARCHFLAGS="-std=c++11" - - PIP_UPDATE="1" - - PYTHON_BUILD=true - - # MacOS 10.12, Python 3.7 - - # - name: "klayout python3 osx10.12" - - name: "cp37-cp37m-macosx_10_12_x86_64.whl" - os: osx - osx_image: xcode9.2 # macOS 10.12 - cache: - directories: - - ccache - addons: - homebrew: - packages: - - python3 - - ccache - update: true - env: - - MATRIX_EVAL="shopt -s expand_aliases; alias python='python3'; alias pip='pip3';" - - ARCHFLAGS="-std=c++11" - - PIP_UPDATE="1" - - PYTHON_BUILD=true - - exclude: - - # No XCode 8.2.1 for Mac OS 10.11 - - # - name: "klayout python3 osx10.11" - - name: "cp37-cp37m-macosx_10_11_x86_64.whl" - os: osx - osx_image: xcode8 # macOS 10.11 - cache: - directories: - - ccache - addons: - homebrew: - packages: - - ccache - update: true - env: - - MATRIX_EVAL="brew update; brew config; brew upgrade python; brew postinstall python; ls -l /usr/local/opt/python/libexec/bin/; shopt -s expand_aliases; alias python='/usr/local/opt/python/libexec/bin/python'; alias pip='/usr/local/opt/python/libexec/bin/pip';" - - ARCHFLAGS="-std=c++11" - - PIP_UPDATE="1" - - PYTHON_BUILD=true - - # Python 2 is EOL - - # python 2 osx - - # - name: "klayout python2 osx10.13" - - name: "cp27-cp27m-macosx_10_13_x86_64.whl" - os: osx - osx_image: xcode9.4 # macOS 10.13 - cache: - directories: - - ccache - addons: - homebrew: - packages: - - ccache - update: true - env: - - MATRIX_EVAL="" - - ARCHFLAGS="-std=c++11" - - PIP_UPDATE="1" - - PYTHON_BUILD=true - - # - name: "klayout python2 osx10.12" - - name: "cp27-cp27m-macosx_10_12_x86_64.whl" - os: osx - osx_image: xcode8.3 # macOS 10.12 - cache: - directories: - - ccache - addons: - homebrew: - packages: - - ccache - update: true - env: - - MATRIX_EVAL="brew install python2 || brew link --overwrite python@2" # deficient python2 in travis's xcode8.3 (no ssl) - - ARCHFLAGS="-std=c++11" - - PIP_UPDATE="1" - - PYTHON_BUILD=true - - # - name: "klayout python2 osx10.11" - - name: "cp27-cp27m-macosx_10_11_x86_64.whl" - os: osx - osx_image: xcode8 # macOS 10.11 - cache: - directories: - - ccache - addons: - homebrew: - packages: - - ccache - update: true - env: - - MATRIX_EVAL="" - - ARCHFLAGS="-std=c++11" - - PIP_UPDATE="1" - - PYTHON_BUILD=true - - # KLayout builds not enabled for now on MacOS - - # KLayout builds for mac - # Python 3 - - name: "KLayout macOS 10.13 with py3.7" - os: osx - osx_image: xcode9.4 # macOS 10.13 - cache: - directories: - - ccache - addons: - homebrew: - packages: - - python3 - - qt - - ccache - update: true - env: - - MATRIX_EVAL="" - - PYTHON_VERSION=B37 - - MACOS_VERSION=HighSierra - - KLAYOUT_BUILD=true - - - name: "KLayout macOS 10.12 with py3.7" - os: osx - osx_image: xcode8.3 # macOS 10.12 - cache: - directories: - - ccache - addons: - homebrew: - packages: - - python3 - - qt - - ccache - update: true - env: - - MATRIX_EVAL="" - - PYTHON_VERSION=B37 - - MACOS_VERSION=Sierra - - KLAYOUT_BUILD=true - - - name: "KLayout macOS 10.11 with py3.7" - os: osx - osx_image: xcode8 # macOS 10.11 - cache: - directories: - - ccache - addons: - homebrew: - packages: - - python3 - - ccache - update: true - env: - - MATRIX_EVAL="brew update; brew config; brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/56c500b569c724b049be7ab9e12d9693f85522f9/Formula/qt.rb" # Qt 5.11.2 - - PYTHON_VERSION=B37 - - MACOS_VERSION=ElCapitan - - KLAYOUT_BUILD=true - - # Python 2 - - name: "KLayout macOS 10.13 with py2.7" - os: osx - osx_image: xcode9.4 # macOS 10.13 - cache: - directories: - - ccache - addons: - homebrew: - packages: - - qt - - ccache - update: true - env: - - MATRIX_EVAL="" - - PYTHON_VERSION=Sys - - MACOS_VERSION=HighSierra - - KLAYOUT_BUILD=true - - - name: "KLayout macOS 10.12 with py2.7" - os: osx - osx_image: xcode8.3 # macOS 10.12 - cache: - directories: - - ccache - addons: - homebrew: - packages: - - qt - - ccache - update: true - env: - - MATRIX_EVAL="" - - PYTHON_VERSION=Sys - - MACOS_VERSION=Sierra - - KLAYOUT_BUILD=true - - - name: "KLayout macOS 10.11 with py2.7" - os: osx - osx_image: xcode8 # macOS 10.11 - cache: - directories: - - ccache - addons: - homebrew: - packages: - - ccache - update: true - env: - - MATRIX_EVAL="brew update; brew config; brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/56c500b569c724b049be7ab9e12d9693f85522f9/Formula/qt.rb" # Qt 5.11.2 - - PYTHON_VERSION=Sys - - MACOS_VERSION=ElCapitan - - KLAYOUT_BUILD=true - -before_install: - - env - - gem install dropbox-deployment - - if [ "${TRAVIS_OS_NAME}" == "osx" ]; then - export PATH="/usr/local/opt/ccache/libexec:$PATH"; - mkdir -p ccache; - export CCACHE_DIR="`pwd`/ccache"; - ccache -s; - fi - - eval "${MATRIX_EVAL}" - - if [ "${PIP_UPDATE}" == "1" ]; then - pip --version; - pip install --upgrade pip || sudo pip install --upgrade pip; - pip --version; - pip install --upgrade setuptools wheel || sudo pip install --upgrade setuptools wheel; - fi - - python -c "import distutils.sysconfig as sysconfig; print(sysconfig.__file__)" - -install: - - if [ "$DOCKER_BUILD" = true ]; then - docker pull $DOCKER_IMAGE; - fi - -script: - - if [ "$DOCKER_BUILD" = true ]; then - mkdir -p ccache; - mkdir -p wheelhouse; - docker run --rm -e DOCKER_IMAGE -e PY_VERSION -v `pwd`:/io $DOCKER_IMAGE $PRE_CMD "/io/ci-scripts/docker/docker_build.sh"; - klayout_version=$(python -c 'import setup; print(setup.Config().version())'); - mkdir -p deploy/dist-pymod/$klayout_version; - cp -a wheelhouse/{klayout-*manylinux2014*.whl,*.zip} deploy/dist-pymod/$klayout_version; - if [ "$TEST_IN_HOST" = true ]; then - pip install klayout --no-index -f ./wheelhouse; - python testdata/pymod/import_db.py; - python testdata/pymod/import_rdb.py; - python testdata/pymod/import_tl.py; - python testdata/pymod/import_lib.py; - python testdata/pymod/pya_tests.py; - fi - fi - - if [ "$PYTHON_BUILD" = true ]; then - python setup.py build; - python setup.py bdist_wheel; - python setup.py install; - python setup.py sdist --formats=zip; - python testdata/pymod/import_db.py; - python testdata/pymod/import_rdb.py; - python testdata/pymod/import_tl.py; - python testdata/pymod/import_lib.py; - python testdata/pymod/pya_tests.py; - klayout_version=$(python -c 'import setup; print(setup.Config().version())'); - mkdir -p deploy/dist-pymod/$klayout_version; - cp -a dist/{*.whl,*.zip} deploy/dist-pymod/$klayout_version; - python -c 'import klayout.db as db; print(dir(db))'; - python -c 'import klayout.rdb as rdb; print(dir(rdb))'; - python -c 'import klayout.tl as tl; print(dir(tl))'; - fi - - if [ "$KLAYOUT_BUILD" = true ]; then - ./travis-build.sh; - fi - -before_cache: - - if [ "${TRAVIS_OS_NAME}" == "osx" ]; then - ccache -s; - fi - -after_success: - # upload to dropbox - # need DROPBOX_OAUTH_BEARER environment variable - - dropbox-deployment - - # uploading to pypi using twine - # need TWINE_USERNAME, TWINE_PASSWORD and TWINE_REPOSITORY_URL env variable - - if [ ! -z "$TRAVIS_TAG" ] && [ ! -z "$TWINE_PASSWORD" ] && [[ "$PYTHON_BUILD" = true || "$DOCKER_BUILD" = true ]]; then - pip install -U twine || sudo pip install -U twine; - twine upload --skip-existing deploy/dist-pymod/$klayout_version/*; - fi diff --git a/Changelog b/Changelog index 3debf64f3..2c1fda1ec 100644 --- a/Changelog +++ b/Changelog @@ -1,3 +1,147 @@ +0.30.10 (2026-07-25): +* Bugfix: %GITHUB%/issues/2384 Deep DRC failure with scaled instances +* Enhancement: %GITHUB%/issues/2391 Grid Features: switching between coarser and finier grids with keyboard shortcut +* Bugfix: %GITHUB%/issues/2392 Wrong PCell instantiations when switching technologies +* Bugfix: %GITHUB%/issues/2396 Python objects did nott support weak refs +* Bugfix: Region#edges was not working properly when used on Regions with properties + enabled. Now, with properties enabled, the regions are consistently formed from polygons with + identical properties before generating the edges. +* Enhancement: %GITHUB%/issues/2398 Clarify 'move to' (and others) scope in window caption +* Enhancement: DRC two-layer checks now do not necessarily require merging for the + first input. This in general speeds up the operation in certain cases. + As a side effect, the error markers may be split according to partial input + polygons, as is the case for plain "space" check already. +* Enhancement: Use multiple drawing workers for image_with_options rendering +* Bugfix: Update layer names in layer list (when used in addition to layer/datatypes) on reload + As a side effect, the layer properties nodes will update the "real source" according to + the actual name if the name is used in addition to layer/datatypes. Also, the layout readers + will update layer names in the layer properties of the Layout object. +* Bugfix: Marek's bug: move interactive/copy interactive did not do anything when the mouse wasn't moved +* Bugfix: Entering '16:17' (or other nonsense) into 'new layout' layer list made KLayout hang +* Bugfix: API: removing a pin from a Circuit does not crash if the pin was not disconnected before. + Now it's disconnected automatically +* Enhancement: Improved the image pixel value display: favors selected image, and follows mouse instantly +* Bugfix: When images are selected and images are turned off, the selection no longer persists +* Bugfix: Using PCell parameter name 'name' won't break PCell's cell_name_impl default implementation +* Enhancement: New API functions + * Create a Layout as a deep copy of a cell (Layout#new) + * PixelBuffer#to_bytes and PixelBuffer#from_bytes for zero-overhead RGBA pixel access + +0.30.9 (2026-05-25): +* Bugfix: %GITHUB%/issues/2331 Screen size error (Assertion tlPixelBuffer.cc:260 n < m_height was not true) +* Enhancement: %GITHUB%/issues/2335 Editor Options (F3) behaviour has changed +* Enhancement: %GITHUB%/issues/2337 [Feature Request] Add to_bytes and from_bytes to shape classes +* Bugfix: %GITHUB%/issues/2339 Ruby ReportDatabase merging can lead to internal error +* Bugfix: %GITHUB%/issues/2343 copy_tree implicitly drops collinear points +* Bugfix: %GITHUB%/issues/2344 Instance properties inside a PCell are not preserved in KLayout +* Bugfix: %GITHUB%/issues/2345 Substrate sequestration + Although this ticket was more a discussion, this enhancement fixes the behavior of + empty layers in deep mode, which allows placing device terminals on them. + This eliminates the need for the workaround mentioned in the ticket. +* Bugfix: %GITHUB%/issues/2350 strm2oas klayout/testdata/gds/issue_1835.gds a.oas, a.oas is empty + With this fix, it is possible to save and load layouts that use a single library references + or PCell variants as top cell. This is not strictly a supported use model, but may be + useful in some cases. The "strm2xxx" tools now allow translating such files from OASIS + to GDS and back. +* Bugfix: %GITHUB%/issues/2356 Edit options always shown, even for klayout -ne +* Enhancement: because of issue #2356 and #2335, the "Editor Options" dock was overhauled + * It is called "Tool Options" now as it hosts not just shape editor options + * The Ruler tool got its own page as the original page was not functional and + rulers have other options. This replicates some settings from the "Ruler + and annotations setup" page. + * The dock widget's visibility can be controlled in the same way than the other + docks. The "Edit/Editor Options" entry moved to "View/Tool Options". It turns + on or off the tool options dock, which is populated with pages depending on the tool. + The default key binding (F3) will now show or hide this dock. +* Enhancement: %GITHUB%/issues/2360 Sort ports by name in "make_top_level_pins" +* Enhancement: A feature to compute a density map. It is found inside Tools/Density Map. + The density map can be computed from one or multiple layers, the region can be + specified in terms of visible region, rulers or bounding boxes of certain layers + or the whole cell. The tool will generate an image overlay over the layout + holding the density data. +* Bugfix: using "xkill" on a KLayout instance ended in a crash +* Enhancement: settings of search features are persisted (see discussion 2868) +* Enhancement: when moving rulers with "snap to objects", all points of the + rulers snap to edges or vertexes now. +* Bugfix: false color maps in images where incorrectly interpolated in some + cases. +* Bugfix: small bugfix in L2N/LVSDB reader - default values of parameters were + treated as int. +* Bugfix: properties on objects with properties (such as BoxWithProperties) where + not properly serialized. Specifically their representation did not include the + type. Hence it was not possible to retrieve properties on deserialization with + "from_s". The fix is to annotate the property values with type information. + NOTE: this is a change that is not backward-compatible. +* Bugfix: snapping rulers to edges parallel to the allowed ruler direction resulted + in skew rulers. +* Enhancement: renamed ruler option for more clarity - changed + 'snap to objects (unless disabled in template)' to 'never snap to object' (inverted) +* Enhancement: enhancements in the script API + * Cell#is_cold_proxy?: indicates if a cell is a "defunc" library reference + * Cell#library_cell_name: gets the library cell name for a "defunc" reference + * Cell#library_name: gets the library name for a "defunc" reference + * Cell#pcell_name: gets the pcell name for a "defunct" reference + * Layout#delete_cells: now available with a list of cell object + * Layout#delete_cell_rec: now available with a cell object + * Layout#prune_cell: now available with a cell object + * Layout#prune_cells: for pruning multiple cells in one call + * Layout#prune_subcells: now with a cell object + * Layout#prune_subcells: now with multiple root cells + * Layout#flatten: now with a cell object + * Layout#flatten_into: now with cell objects + * Layout#delete_cell: now with a cell object + * Default value "all" for "levels" argument in "prune_subcells" and "prune_cell" + * Default value "all" for "levels" and "true" for "prune" argument in "flatten" + * Default value "all" for "levels" and "unity" for "trans" argument in "flatten_into" + +0.30.8 (2026-04-14): +* Enhancement: %GITHUB%/issues/2248 Switch layouts but without losing the handle +* Bugfix: %GITHUB%/issues/2299 gf180mcu DRC performance regression. + This patch contains some other enhancements which improve performance of DRC, + although in certain cases only. +* Enhancement: %GITHUB%/issues/2300 More options to set layout format, specifically on LEF/DEF +* Bugfix: %GITHUB%/2301 UI freezes permanently with open Macro Development window and event listening plugin +* Bugfix: %GITHUB%/issues/2305 Library reloading problems +* Enhancement: %GITHUB%/2306 Feature Request: API-access to a setter for the selected entry in the Netlist Database Browser +* Bugfix: %GITHUB%/2311 Tip window is shown although running in non-GUI modebug +* Bugfix: %GITHUB%/2315 Edit/Layout/Scale causes confusing +* Enhancement: %GITHUB%/2316 Edit/Selection/Make Array: support both pitch and spacing +* Bugfix: %GITHUB%/2320 Failure to read OASIS files with large property strings +* Enhancement: %GITHUB%/2322 Options(text): split text scaling and rotation into two separate options +* Enhancement: %GITHUB%/2326 Fit shouldn't take bbox of "empty" struct into account +* Bugfix: %GITHUB%/2331 Screen size error (Assertion tlPixelBuffer.cc:260 n < m_height was not true) +* Enhancement: "strmrun" now can run DRC and LVS scripts +* Enhancement: "Library#library_by_name" now can be used with "*" for technology +* Bugfix: PCell "coerce_parameters" and "callback" was called with the client layout + instead of definition layout, hence the DBU was incorrect if both layouts have different DBU. +* Enhancement: new config option: disable generation of new layers + The name of the config option is "auto-create-new-layers". + With this option set to true (default), new layers are automatically added to the layer list on + "paste" or placing instances. +* Enhancement: hovering over a pixel of an image with display the pixel's value in + the status bar. +* Enhancement: experimental support for library declaration files to install static + libraries from other places than the "library" folder and with additional metadata. + +0.30.7 (2026-03-07): +* Enhancement: %GITHUB%/issues/2248 Switch layouts but without losing the handle +* Bugfix: %GITHUB%/issues/2273 Potential use-after-free bug due to Ruby GC +* Bugfix: %GITHUB%/issues/2277 Poor netlister performance in some cases +* Enhancement: %GITHUB%/issues/2278 Option to hide markers frames +* Bugfix: %GITHUB%/issues/2284 klayoutrc parse issue silently replaces config file +* Bugfix: %GITHUB%/issues/2286 CLI arguments, '--help' / '--version' should be implemented +* Bugfix: %GITHUB%/issues/2293 Layers window: changing the layer order with the arrow buttons deselects the layer to be moved +* Enhancement: ReportDatabase#merge - a method to merge two report databases +* Bugfix: double clicking an edge in partial mode opened the properties dialog, not setting a point +* Bugfix: Python did not support downcasting of PolygonWithProperties to Polygon on Shapes#polygon for example +* Bugfix: OASIS reader was not able to read S_GDS_PROPERTY from file level or under forward reference conditions +* Enhancement: Adding an option '-of|--format' to strmxor and strmclip to specify the output format instead of taking it from the suffix +* Bugfix: 'oasis_read_all_options' as always on in buddy tools +* Bugfix: avoid a crash on application exit when using objects for user property values or names +* Bugfix: Fixing a small glitch: drawing into a ghost cell is possible, but did not turn off the ghost cell flag +* Bugfix: Fixing a potential segfault during layout painting due to a race condition (rare but happened) +* Enhancement: Performance improvement for hierarchical processor - better parallelization in some cases + 0.30.6 (2026-02-07): * Bugfix: %GITHUB%/issues/2210 LayoutView::create_measure_ruler() creates incorrect rulers * Enhancement: %GITHUB%/issues/2214 Take selection modifer into account on release rather than on click diff --git a/Changelog.Debian b/Changelog.Debian index fab33ed72..e47e0ee66 100644 --- a/Changelog.Debian +++ b/Changelog.Debian @@ -1,3 +1,31 @@ +klayout (0.30.10-1) unstable; urgency=low + + * New features and bugfixes + - See changelog + + -- Matthias Köfferlein Sat, 25 Jul 2026 09:48:16 +0200 + +klayout (0.30.9-1) unstable; urgency=low + + * New features and bugfixes + - See changelog + + -- Matthias Köfferlein Mon, 25 May 2026 19:46:05 +0200 + +klayout (0.30.8-1) unstable; urgency=low + + * New features and bugfixes + - See changelog + + -- Matthias Köfferlein Tue, 14 Apr 2026 19:16:26 +0200 + +klayout (0.30.7-1) unstable; urgency=low + + * New features and bugfixes + - See changelog + + -- Matthias Köfferlein Sat, 07 Mar 2026 13:30:05 +0100 + klayout (0.30.6-1) unstable; urgency=low * New features and bugfixes diff --git a/azure-pipelines.yml b/azure-pipelines.yml index affe740df..ee32f44b1 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -7,6 +7,44 @@ trigger: tags: include: - 'v*' + paths: + exclude: + - '*.md' + - docs/* + - samples/* + - etc/* + - macbuild/* + - ci-scripts/* + - scripts/* + - .travis.yml + - Jenkinsfile* + - .gitignore + - LICENSE + - COPYRIGHT + - CONTRIB + - Changelog* + +pr: + branches: + include: + - master + - staging + paths: + exclude: + - '*.md' + - docs/* + - samples/* + - etc/* + - macbuild/* + - ci-scripts/* + - scripts/* + - .travis.yml + - Jenkinsfile* + - .gitignore + - LICENSE + - COPYRIGHT + - CONTRIB + - Changelog* jobs: - job: Build @@ -14,18 +52,6 @@ jobs: vmImage: 'windows-2022' # other options: 'macOS-10.13', 'ubuntu-16.04' strategy: matrix: - cp36-cp36m-win_amd64.whl: - python.version: '3.6' - python.architecture: 'x64' - cp37-cp37m-win_amd64.whl: - python.version: '3.7' - python.architecture: 'x64' - cp38-cp38-win_amd64.whl: - python.version: '3.8' - python.architecture: 'x64' - cp39-cp39-win_amd64.whl: - python.version: '3.9' - python.architecture: 'x64' cp310-cp310-win_amd64.whl: python.version: '3.10' python.architecture: 'x64' @@ -41,18 +67,6 @@ jobs: cp314-cp314-win_amd64.whl: python.version: '3.14' python.architecture: 'x64' - cp36-cp36m-win32.whl: - python.version: '3.6' - python.architecture: 'x86' - cp37-cp37m-win32.whl: - python.version: '3.7' - python.architecture: 'x86' - cp38-cp38-win32.whl: - python.version: '3.8' - python.architecture: 'x86' - cp39-cp39-win32.whl: - python.version: '3.9' - python.architecture: 'x86' cp310-cp310-win32.whl: python.version: '3.10' python.architecture: 'x86' @@ -76,6 +90,13 @@ jobs: versionSpec: '$(python.version)' architecture: '$(python.architecture)' + - task: Cache@2 + inputs: + key: 'microbits | "4.0"' + path: $(Build.SourcesDirectory)/klayout-microbits + cacheHitVar: MICROBITS_CACHED + displayName: 'Cache KLayout microbits' + # Add additional tasks to run using each Python version in the matrix above # PowerShell @@ -86,9 +107,13 @@ jobs: #arguments: # Optional script: | # Required when targetType == Inline pwd - Invoke-WebRequest -Uri "https://www.klayout.org/downloads/klayout-microbits-4.0.zip" -OutFile klayout-microbits-4.0.zip - dir - Expand-Archive klayout-microbits-4.0.zip -DestinationPath klayout-microbits + if ("$(MICROBITS_CACHED)" -ne "true") { + Write-Host "Cache miss: downloading and extracting KLayout microbits..." + Invoke-WebRequest -Uri "https://www.klayout.org/downloads/klayout-microbits-4.0.zip" -OutFile klayout-microbits-4.0.zip + Expand-Archive klayout-microbits-4.0.zip -DestinationPath klayout-microbits + } else { + Write-Host "Cache hit: restored KLayout microbits from cache." + } dir klayout-microbits #errorActionPreference: 'stop' # Optional. Options: stop, continue, silentlyContinue #failOnStderr: false # Optional @@ -174,26 +199,6 @@ jobs: inputs: artifactName: 'wheel-3.10.x64' downloadPath: '$(System.DefaultWorkingDirectory)' - - task: DownloadBuildArtifacts@0 - displayName: 'Download Build Artifacts wheel-3.9.x64' - inputs: - artifactName: 'wheel-3.9.x64' - downloadPath: '$(System.DefaultWorkingDirectory)' - - task: DownloadBuildArtifacts@0 - displayName: 'Download Build Artifacts wheel-3.8.x64' - inputs: - artifactName: 'wheel-3.8.x64' - downloadPath: '$(System.DefaultWorkingDirectory)' - - task: DownloadBuildArtifacts@0 - displayName: 'Download Build Artifacts wheel-3.7.x64' - inputs: - artifactName: 'wheel-3.7.x64' - downloadPath: '$(System.DefaultWorkingDirectory)' - - task: DownloadBuildArtifacts@0 - displayName: 'Download Build Artifacts wheel-3.6.x64' - inputs: - artifactName: 'wheel-3.6.x64' - downloadPath: '$(System.DefaultWorkingDirectory)' - task: DownloadBuildArtifacts@0 displayName: 'Download Build Artifacts wheel-3.14.x86' inputs: @@ -219,26 +224,6 @@ jobs: inputs: artifactName: 'wheel-3.10.x86' downloadPath: '$(System.DefaultWorkingDirectory)' - - task: DownloadBuildArtifacts@0 - displayName: 'Download Build Artifacts wheel-3.9.x86' - inputs: - artifactName: 'wheel-3.9.x86' - downloadPath: '$(System.DefaultWorkingDirectory)' - - task: DownloadBuildArtifacts@0 - displayName: 'Download Build Artifacts wheel-3.8.x86' - inputs: - artifactName: 'wheel-3.8.x86' - downloadPath: '$(System.DefaultWorkingDirectory)' - - task: DownloadBuildArtifacts@0 - displayName: 'Download Build Artifacts wheel-3.7.x86' - inputs: - artifactName: 'wheel-3.7.x86' - downloadPath: '$(System.DefaultWorkingDirectory)' - - task: DownloadBuildArtifacts@0 - displayName: 'Download Build Artifacts wheel-3.6.x86' - inputs: - artifactName: 'wheel-3.6.x86' - downloadPath: '$(System.DefaultWorkingDirectory)' - task: CopyFiles@2 condition: always() inputs: diff --git a/build.sh b/build.sh index 1413134cc..ae7aa09bd 100755 --- a/build.sh +++ b/build.sh @@ -41,6 +41,7 @@ HAVE_CURL=0 HAVE_EXPAT=0 HAVE_GIT2=1 HAVE_LSTREAM=1 +HAVE_CPP20=0 RUBYINCLUDE="" RUBYINCLUDE2="" @@ -217,6 +218,9 @@ while [ "$*" != "" ]; do -nolstream) HAVE_LSTREAM=0 ;; + -cpp20) + HAVE_CPP20=1 + ;; -qt5) echo "*** WARNING: -qt5 option is ignored - Qt version is auto-detected now." ;; @@ -275,6 +279,7 @@ while [ "$*" != "" ]; do echo " -libpng Use libpng instead of Qt for PNG generation" echo " -nolibgit2 Do not include libgit2 for Git package support" echo " -nolstream Do not include the LStream plugin" + echo " -cpp20 Uses some C++20 features (e.g. atomics)" echo "" echo "Environment Variables:" echo "" @@ -670,6 +675,7 @@ qmake_options=( HAVE_PNG="$HAVE_PNG" HAVE_GIT2="$HAVE_GIT2" HAVE_LSTREAM="$HAVE_LSTREAM" + HAVE_CPP20="$HAVE_CPP20" PREFIX="$BIN" RPATH="$RPATH" KLAYOUT_VERSION="$KLAYOUT_VERSION" diff --git a/dropbox-deployment.yml b/dropbox-deployment.yml deleted file mode 100644 index f9ee0f21b..000000000 --- a/dropbox-deployment.yml +++ /dev/null @@ -1,4 +0,0 @@ -deploy: - dropbox_path: /Builds/klayout # The path to the folder on Dropbox where the files will go - artifacts_path: deploy # can be a single file, or a path - debug: true # if you want to see more logs diff --git a/macbuild/ReadMe.md b/macbuild/ReadMe.md index 4bf2aeb5b..f11a326ab 100644 --- a/macbuild/ReadMe.md +++ b/macbuild/ReadMe.md @@ -1,16 +1,17 @@ -Relevant KLayout version: 0.30.5
+Relevant KLayout version: 0.30.9
Author: Kazzz-S
-Last modified: 2025-11-10
+Last modified: 2026-07-26
# 1. Introduction -This directory **`macbuild`** contains various files required for building KLayout (http://www.klayout.de/) version 0.30.5 or later for different 64-bit macOS, including: +This directory **`macbuild`** contains various files required for building KLayout (http://www.klayout.de/) version 0.30.9 or later for different 64-bit macOS, including: +* Golden Gate (27.x) : really experimental (on M4 Mac Mini) * Tahoe (26.x) : really experimental (on M4 Mac Mini) * Sequoia (15.x) : the primary development environment * Sonoma (14.x) : experimental Building KLayout for the previous operating systems listed below has been discontinued.
Pre-built DMG packages are also not provided.
-As of today (November 2025), Homebrew classifies macOS Catalina 10.15 - Ventura 13 as Tier 3. +As of November 2025, Homebrew classifies macOS Catalina 10.15 - Ventura 13 as Tier 3. * Ventura (13.7.8; the build would still be possible) * Monterey (12.7.6; the build would still be possible) * Big Sur (11.7.10) @@ -47,7 +48,7 @@ Then, follow the instructions in Section 6F. The migration work to "Qt6" is ongoing. You can try to use it; however, you might encounter some build or runtime errors.
If you use **Homebrew** to build KLayout >= 0.29.0, you need "Qt6" to address [the compilation issue](https://github.com/KLayout/klayout/issues/1599).
-I have also tried migrating to "Python 3.13.x" (earlier, Python 3.12.x) in this version. +I have also tried migrating to "Python 3.14.x" (earlier, Python 3.13.x) in this version. # 3. Script language support: Ruby and Python @@ -72,7 +73,7 @@ The operating system type is detected automatically. ``` ----------------------------------------------------------------------------------------------------------- << Usage of 'build4mac.py' >> - for building KLayout 0.30.5 or later on different Apple macOS platforms. + for building KLayout 0.30.9 or later on different Apple macOS platforms. $ [python] ./build4mac.py option & argument : descriptions (refer to 'macbuild/build4mac_env.py' for details) | default value @@ -88,27 +89,27 @@ $ [python] ./build4mac.py : (*) migration to Qt6 is ongoing | [-r|--ruby ] : case-insensitive type=['nil', 'Sys', 'MP34', 'HB34', 'Ana3'] | sys : nil: don't bind Ruby | - : Sys: use [Tahoe|Sequoia|Sonoma]-bundled Ruby 2.6 | + : Sys: use [GoldenGate|Tahoe|Sequoia|Sonoma]-bundled Ruby 2.6 | : MP34: use Ruby 3.4 from MacPorts | : HB34: use Ruby 3.4 from Homebrew | : Ana3: use Ruby 3.4 from Anaconda3 | - [-p|--python ] : case-insensitive type=['nil', 'Sys', 'MP313', 'HB313', 'Ana3', | sys - : 'MP312', 'MP312', | - : 'MP311', 'HB311', 'HBAuto'] | + [-p|--python ] : case-insensitive type=['nil', 'Sys', 'MP314', 'HB314', 'Ana3', | sys + : 'MP314', 'HB314', | + : 'HB311', 'HBAuto'] | : nil: don't bind Python | - : Sys: use [Tahoe|Sequoia|Sonoma]-bundled Python 3.9 | - : MP313: use Python 3.13 from MacPorts | - : HB313: use Python 3.13 from Homebrew | - : Ana3: use Python 3.13 from Anaconda3 | - : MP312: use Python 3.12 from MacPorts | - : HB312: use Python 3.12 from Homebrew | - : MP311: use Python 3.11 from MacPorts | + : Sys: use [GoldenGate|Tahoe|Sequoia|Sonoma]-bundled Python 3.9 | + : MP314: use Python 3.14 from MacPorts | + : HB314: use Python 3.14 from Homebrew | + : Ana3: use Python 3.14 from Anaconda3 | + : MP314: use Python 3.14 from MacPorts | + : HB314: use Python 3.14 from Homebrew | : HB311: use Python 3.11 from Homebrew (+) | : (+) required to provide the legacy pip in HW-*.dmg | : HBAuto: use the latest Python 3.x auto-detected from Homebrew | [-P|--buildPymod] : build and deploy Pymod (*.whl) for LW-*.dmg | disabled [-n|--noqtbinding] : don't create Qt bindings for ruby scripts | disabled [-u|--noqtuitools] : don't include uitools in Qt binding | disabled + [-s|--no32bitcoord] : don't use short (32bit) coordinates; use long (64bit) instead | disabled [-g|--nolibgit2] : don't include libgit2 for Git package support | disabled [-m|--make