From 97f0c7603232d0e288258d0346ece77201552d24 Mon Sep 17 00:00:00 2001
From: Mohamed Gaber
Date: Tue, 25 Jun 2024 12:57:30 +0300
Subject: [PATCH 1/6] Remove reference to unmaintained colab
---
README.md | 3 ---
1 file changed, 3 deletions(-)
diff --git a/README.md b/README.md
index 4590f4ca4..54adea6f2 100644
--- a/README.md
+++ b/README.md
@@ -16,9 +16,6 @@ You can check out the documentation, including in-depth guides and reference man
-## Quick-start Guide
-If you just want to try OpenLane out, try [this Colaboratory](https://colab.research.google.com/github/chipsalliance/silicon-notebooks/blob/main/digital-inverter-openlane.ipynb) by our friends at Google and ChipsAlliance. It's an online Python-based utility, and the best part is, *you don't need to install anything.*
-
## Installation, the short version
The short version is, to install the OpenLane environment...
From a0e805e70f9dca8e80286ed807195008a2fc36c0 Mon Sep 17 00:00:00 2001
From: Kareem Farid
Date: Wed, 26 Jun 2024 11:58:35 +0300
Subject: [PATCH 2/6] Add docker upgrade instructions to docs (#2132)
Signed-off-by: Kareem Farid
---
.../getting_started/installation/installation_linux.md | 4 ++++
.../getting_started/installation/installation_macos.md | 8 ++++++++
.../getting_started/installation/installation_ubuntu.md | 5 +++++
.../getting_started/installation/installation_win.md | 5 +++++
4 files changed, 22 insertions(+)
diff --git a/docs/source/getting_started/installation/installation_linux.md b/docs/source/getting_started/installation/installation_linux.md
index 47349db4a..e4b46aed6 100644
--- a/docs/source/getting_started/installation/installation_linux.md
+++ b/docs/source/getting_started/installation/installation_linux.md
@@ -23,6 +23,10 @@ supported.
First, install Docker following the steps provided [in this link](https://docs.docker.com/engine/install/).
+:::{note}
+Make sure Docker is up to date with the latest release provided by your distribution.
+:::
+
Test if installation was successful:
```
diff --git a/docs/source/getting_started/installation/installation_macos.md b/docs/source/getting_started/installation/installation_macos.md
index af54aaa76..1bbb95204 100644
--- a/docs/source/getting_started/installation/installation_macos.md
+++ b/docs/source/getting_started/installation/installation_macos.md
@@ -12,5 +12,13 @@ brew install python make
brew install --cask docker
```
+If brew and the dependencies are already installed, make sure they are up to date:
+
+```sh
+brew update
+brew upgrade python make
+brew upgrade --cask docker
+```
+
```{include} installation_common_section.md
```
diff --git a/docs/source/getting_started/installation/installation_ubuntu.md b/docs/source/getting_started/installation/installation_ubuntu.md
index 0f97a7d24..6748e2575 100644
--- a/docs/source/getting_started/installation/installation_ubuntu.md
+++ b/docs/source/getting_started/installation/installation_ubuntu.md
@@ -13,6 +13,11 @@ Only Ubuntu 20.04 and above are supported.
Next, install Docker.
Follow [the instructions provided in the Docker documentation here](https://docs.docker.com/engine/install/ubuntu/) as the steps provided below might be outdated.
+:::{note}
+If Docker is already installed, make sure that it is up to date by
+[following these instructions in the Docker documentation](https://docs.docker.com/engine/install/ubuntu/#upgrade-docker-engine-1)
+:::
+
:::{warning}
The steps below might become outdated, it is encouraged to follow the link to the official Docker documentation.
:::
diff --git a/docs/source/getting_started/installation/installation_win.md b/docs/source/getting_started/installation/installation_win.md
index 20d0ded3c..bbb978eba 100644
--- a/docs/source/getting_started/installation/installation_win.md
+++ b/docs/source/getting_started/installation/installation_win.md
@@ -10,6 +10,11 @@ The following is the recommended installation method under Windows. Other virtua
1. Follow [official Microsoft documentation for WSL located here](https://docs.microsoft.com/en-us/windows/wsl/install) to install the WSL 2. Make sure your OS version supports WSL 2.
2. Follow [official steps to Install Docker Desktop on Windows located here](https://docs.docker.com/desktop/install/windows-install/).
+
+ :::{note}
+ Make sure to update Docker if it is already installed.
+ :::
+
3. Make sure that `WSL 2 Docker engine` is enabled and `Settings` -> `Resource` -> `WSL Integration` is enabled
4. Make sure that option `Start Docker Desktop when you login` is enabled in `Docker Desktop` -> `Settings`
From 20d7d2c5372cebd61f3251328080bfce81a2819e Mon Sep 17 00:00:00 2001
From: Kareem Farid
Date: Thu, 4 Jul 2024 16:39:33 +0300
Subject: [PATCH 3/6] Workaround for Click not being included in KLayout's
Python (#2136)
Signed-off-by: Kareem Farid
---
gui.py | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/gui.py b/gui.py
index 26fdaee8d..bc9fde256 100755
--- a/gui.py
+++ b/gui.py
@@ -109,6 +109,14 @@ def gui(viewer, format, run_dir, stage):
layout,
]
)
+ pythonpath = subprocess.check_output(
+ [
+ "python3",
+ "-c",
+ "import click; import os; print(os.path.dirname(click.__path__[0])); print(1)",
+ ]
+ ).decode()
+ run_env["PYTHONPATH"] = pythonpath
subprocess.check_call(
[
"klayout",
From 46d8e5a0420cd377c7fc8d180db283e76ab3dc0e Mon Sep 17 00:00:00 2001
From: Mohamed Gaber
Date: Sun, 7 Jul 2024 23:08:26 +0300
Subject: [PATCH 4/6] Upgrade to `nix-eda` (#2135)
~ Avoid using `/dev/null` for writing DEF files (it tries to create a temp file and fail)
~ PDK now has a default value of sky130A even outside the Makefile
~ PDK_ROOT now set automatically if Volare is installed
~ Upgrade to a newer version of OpenLane 2, which in turns uses `nix-eda`
~ Format nix packages using Alejandra
~ OpenROAD scripts now read liberty files before database files (they are linked together when the database is read)
~ Update Readme to remove Colab and add banner directing people to OpenLane 2
---
.github/scripts/add_openroad_overrides.py | 99 ++++++++++++++++++++
.github/scripts/update_tools.py | 1 +
README.md | 12 +--
default.nix | 74 +++++++--------
dependencies/verify_versions.py | 3 +-
dependencies/version.py | 1 -
docker/docker.nix | 28 +++---
docs/_static/ol2_banner.svg | 74 ++++++++-------
flake.lock | 105 +++++++++++++++++++---
flake.nix | 57 ++++++------
scripts/config/tcl.py | 2 +-
scripts/count_lvs.py | 1 -
scripts/drc_rosetta.py | 2 +-
scripts/odbpy/diodes.py | 1 -
scripts/odbpy/wire_lengths.py | 2 +-
scripts/openroad/common/io.tcl | 35 ++++----
scripts/padframe_generator.py | 10 ---
scripts/report/get_best.py | 1 -
scripts/tcl_commands/all.tcl | 29 +++---
scripts/topModuleGen/src/TopModuleGen.py | 2 +
scripts/utils/utils.tcl | 2 +-
tests/1935-cts-crash/interactive.tcl | 3 -
tests/1935-cts-crash/reproducible | 1 -
23 files changed, 363 insertions(+), 182 deletions(-)
create mode 100644 .github/scripts/add_openroad_overrides.py
delete mode 100644 tests/1935-cts-crash/interactive.tcl
delete mode 120000 tests/1935-cts-crash/reproducible
diff --git a/.github/scripts/add_openroad_overrides.py b/.github/scripts/add_openroad_overrides.py
new file mode 100644
index 000000000..39c42754d
--- /dev/null
+++ b/.github/scripts/add_openroad_overrides.py
@@ -0,0 +1,99 @@
+# Copyright 2024 Efabless Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+import re
+import argparse
+import subprocess
+import sys
+import json
+import os
+
+
+def get_submodule_revs(filter, repository, commit):
+ api_result = None
+ filter = re.compile(filter)
+
+ try:
+ api_result = subprocess.check_output(
+ [
+ "curl",
+ "--fail",
+ "-s",
+ "-L",
+ "-H",
+ "Accept: application/vnd.github.v3+json",
+ f"https://api.github.com/repos/{repository}/git/trees/{commit}?recursive=True",
+ ]
+ )
+ except Exception as e:
+ print(e, file=sys.stderr)
+ sys.exit(os.EX_DATAERR)
+
+ api_result_parsed = json.loads(api_result)
+ api_result_tree = api_result_parsed["tree"]
+ submodules = [element for element in api_result_tree if element["type"] == "commit"]
+ return {
+ submodule["path"]: submodule["sha"]
+ for submodule in submodules
+ if filter.search(submodule["path"])
+ }
+
+
+def override_openroad_versions(commit):
+ info = {
+ "openroad": {
+ "rev": commit,
+ "repo": "The-OpenROAD-Project/OpenROAD",
+ }
+ }
+ submodule_revs = get_submodule_revs(r"sta|abc", info["openroad"]["repo"], commit)
+ info["opensta"] = {
+ "rev": submodule_revs["src/sta"],
+ "repo": "The-OpenROAD-Project/OpenSTA",
+ }
+ info["openroad-abc"] = {
+ "rev": submodule_revs["third-party/abc"],
+ "repo": "The-OpenROAD-Project/abc",
+ }
+ for derivation, info in info.items():
+ prefetch_info = subprocess.check_output(
+ [
+ "nix",
+ "run",
+ "github:seppeljordan/nix-prefetch-github",
+ "--",
+ "--rev",
+ info["rev"],
+ ]
+ + info["repo"].split("/"),
+ encoding="utf8",
+ )
+ prefetch_info_json = json.loads(prefetch_info)
+ hash = prefetch_info_json["hash"]
+ subprocess.check_call(
+ [
+ "sed",
+ "-i.bak",
+ f"s/# {derivation}-rev-sha/rev = \"{info['rev']}\"; sha256 = \"{hash}\";/",
+ "flake.nix",
+ ]
+ )
+
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(
+ description="Adds overrides for a given OpenROAD commit hash to flake.nix. Requires Nix with Flakes+Nix-Command enabled as well as curl and GNU sed."
+ )
+ parser.add_argument("commit", help="commit hash")
+ args = parser.parse_args()
+ override_openroad_versions(args.commit)
diff --git a/.github/scripts/update_tools.py b/.github/scripts/update_tools.py
index 78988953a..e1b2ce442 100644
--- a/.github/scripts/update_tools.py
+++ b/.github/scripts/update_tools.py
@@ -32,6 +32,7 @@
tools = Tool.from_metadata_yaml(open(metadata_path).read())
+
# Handle Multiline Strings Properly / https://stackoverflow.com/a/33300001
def represent_str(dumper: yaml.Dumper, data: str):
if "\n" in data:
diff --git a/README.md b/README.md
index 54adea6f2..61f9bf6b4 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,9 @@
+
+
+
+
+
+
OpenLane
@@ -10,12 +16,6 @@ OpenLane is an automated RTL to GDSII flow based on several components including
You can check out the documentation, including in-depth guides and reference manuals at [ReadTheDocs](https://openlane.readthedocs.io/).
-
-
-
-
-
-
## Installation, the short version
The short version is, to install the OpenLane environment...
diff --git a/default.nix b/default.nix
index d1cb214ad..d14b661cf 100644
--- a/default.nix
+++ b/default.nix
@@ -31,31 +31,33 @@
openroad,
klayout,
netgen,
- magic,
+ magic-vlsi,
verilog,
verilator,
+ volare,
tclFull,
-}:
-let
- pyenv = (python3.withPackages (ps: with ps; [
- libparse
- click
- pyyaml
- XlsxWriter
- klayout-pymod
- ]));
+}: let
+ pyenv = python3.withPackages (ps:
+ with ps; [
+ libparse
+ click
+ pyyaml
+ XlsxWriter
+ klayout-pymod
+ volare
+ ]);
pyenv-sitepackages = "${pyenv}/${pyenv.sitePackages}";
in
stdenv.mkDerivation rec {
name = "openlane1";
-
+
src = [
./flow.tcl
./scripts
./configuration
./dependencies
];
-
+
unpackPhase = ''
echo $src
for file in $src; do
@@ -64,49 +66,51 @@ in
done
ls -lah
'';
-
+
passthru = {
pyenv = pyenv;
};
-
+
includedTools = [
yosys
opensta
openroad
klayout
netgen
- magic
+ magic-vlsi
verilog
verilator
tclFull
];
-
- propagatedBuildInputs = includedTools ++ [
- pyenv
- ncurses
- coreutils-full
- gnugrep
- gnused
- bash
- gnutar
- gzip
- git
- ];
-
+
+ propagatedBuildInputs =
+ includedTools
+ ++ [
+ pyenv
+ ncurses
+ coreutils-full
+ gnugrep
+ gnused
+ bash
+ gnutar
+ gzip
+ git
+ ];
+
nativeBuildInputs = [makeWrapper];
-
+
installPhase = ''
mkdir -p $out/bin
cp -r * $out/bin
wrapProgram $out/bin/flow.tcl\
- --set PATH ${lib.makeBinPath (propagatedBuildInputs)}\
- --set PYTHONPATH ${pyenv-sitepackages}
+ --set PATH ${lib.makeBinPath propagatedBuildInputs}\
+ --set PYTHONPATH ${pyenv-sitepackages}
'';
-
+
doCheck = true;
-
- computed_PATH = lib.makeBinPath (propagatedBuildInputs);
-
+
+ computed_PATH = lib.makeBinPath propagatedBuildInputs;
+
meta = with lib; {
description = "RTL-to-GDSII flow for application-specific integrated circuits (ASIC)s";
homepage = "https://efabless.com/openlane";
diff --git a/dependencies/verify_versions.py b/dependencies/verify_versions.py
index 07dfc4add..c7958d8bf 100644
--- a/dependencies/verify_versions.py
+++ b/dependencies/verify_versions.py
@@ -128,7 +128,8 @@ def verify_versions(
)
for name, commit in tool_versions:
- print(name, commit)
+ if name not in manifest_dict:
+ continue
manifest_commit = manifest_dict[name]["commit"]
if commit != manifest_commit:
diff --git a/dependencies/version.py b/dependencies/version.py
index 191f61a34..dfb83e90d 100644
--- a/dependencies/version.py
+++ b/dependencies/version.py
@@ -401,7 +401,6 @@ def _legacy_cmpkey(version):
class Version(_BaseVersion):
-
_regex = re.compile(r"^\s*" + VERSION_PATTERN + r"\s*$", re.VERBOSE | re.IGNORECASE)
def __init__(self, version):
diff --git a/docker/docker.nix b/docker/docker.nix
index fd2793e27..25c6090bb 100644
--- a/docker/docker.nix
+++ b/docker/docker.nix
@@ -25,15 +25,11 @@
silver-searcher,
coreutils,
}:
-
-assert builtins.elem system ["x86_64-linux" "aarch64-linux"];
-
-let
- docker-arch-name = if system == "x86_64-linux" then
- "amd64"
- else
- "arm64v8"
- ;
+assert builtins.elem system ["x86_64-linux" "aarch64-linux"]; let
+ docker-arch-name =
+ if system == "x86_64-linux"
+ then "amd64"
+ else "arm64v8";
in (createDockerImage {
inherit pkgs;
inherit lib;
@@ -53,7 +49,7 @@ in (createDockerImage {
};
maxLayers = 2;
channelURL = "https://nixos.org/channels/nixos-23.11";
-
+
image-created = "now";
image-extraCommands = ''
mkdir -p ./etc
@@ -63,7 +59,7 @@ in (createDockerImage {
autoload -U compinit && compinit
autoload -U promptinit && promptinit && prompt suse && setopt prompt_sp
autoload -U colors && colors
-
+
export PS1=$'%{\033[31m%}OpenLane Container%{\033[0m%}:%{\033[32m%}%~%{\033[0m%}%% ';
HEREDOC
'';
@@ -74,10 +70,10 @@ in (createDockerImage {
openlane1.computed_PATH
];
image-config-extra-env = [
- "LANG=C.UTF-8"
- "LC_ALL=C.UTF-8"
- "LC_CTYPE=C.UTF-8"
- "EDITOR=nvim"
- "TMPDIR=/tmp"
+ "LANG=C.UTF-8"
+ "LC_ALL=C.UTF-8"
+ "LC_CTYPE=C.UTF-8"
+ "EDITOR=nvim"
+ "TMPDIR=/tmp"
];
})
diff --git a/docs/_static/ol2_banner.svg b/docs/_static/ol2_banner.svg
index 2ab3ce2a6..813a9dffd 100644
--- a/docs/_static/ol2_banner.svg
+++ b/docs/_static/ol2_banner.svg
@@ -12,7 +12,7 @@
inkscape:export-filename="banner.svg"
inkscape:export-xdpi="200"
inkscape:export-ydpi="200"
- inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
+ inkscape:version="1.3.2 (091e20e, 2023-11-25)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
@@ -28,19 +28,19 @@
inkscape:document-units="mm"
showgrid="false"
inkscape:zoom="2.5877449"
- inkscape:cx="259.29912"
- inkscape:cy="-44.247019"
- inkscape:window-width="3440"
- inkscape:window-height="1287"
+ inkscape:cx="237.07901"
+ inkscape:cy="51.009665"
+ inkscape:window-width="2296"
+ inkscape:window-height="1039"
inkscape:window-x="0"
- inkscape:window-y="32"
- inkscape:window-maximized="1"
+ inkscape:window-y="25"
+ inkscape:window-maximized="0"
inkscape:current-layer="layer1" />Feeling adventurous? Take a sneak peek at thenext generation of OpenLane, rebuilt from the groundup for customizability.Introducing: OpenLane 2!
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Helvetica, 'Open Sans', Arial, sans-serif;-inkscape-font-specification:'Helvetica, Open Sans, Arial, sans-serif';fill:#000000;stroke:none;stroke-width:0.11173"
+ x="49.292446"
+ y="5.2173305">Try OpenLane 2!While OpenLane 1 remains the primary stable version for designs targeting EfablesschipIgnite, we are no longer actively adding new features.Click here to go to the current version, OpenLane 2.
diff --git a/flake.lock b/flake.lock
index 507b273d3..06fcfc675 100644
--- a/flake.lock
+++ b/flake.lock
@@ -1,5 +1,28 @@
{
"nodes": {
+ "devshell": {
+ "inputs": {
+ "flake-utils": "flake-utils",
+ "nixpkgs": [
+ "openlane2",
+ "nix-eda",
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1717408969,
+ "narHash": "sha256-Q0OEFqe35fZbbRPPRdrjTUUChKVhhWXz3T9ZSKmaoVY=",
+ "owner": "numtide",
+ "repo": "devshell",
+ "rev": "1ebbe68d57457c8cae98145410b164b5477761f4",
+ "type": "github"
+ },
+ "original": {
+ "owner": "numtide",
+ "repo": "devshell",
+ "type": "github"
+ }
+ },
"flake-compat": {
"locked": {
"narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
@@ -13,18 +36,38 @@
"url": "https://flakehub.com/f/edolstra/flake-compat/1.tar.gz"
}
},
+ "flake-utils": {
+ "inputs": {
+ "systems": "systems"
+ },
+ "locked": {
+ "lastModified": 1701680307,
+ "narHash": "sha256-kAuep2h5ajznlPMD9rnQyffWG8EM/C73lejGofXvdM8=",
+ "owner": "numtide",
+ "repo": "flake-utils",
+ "rev": "4022d587cbbfd70fe950c1e2083a02621806a725",
+ "type": "github"
+ },
+ "original": {
+ "owner": "numtide",
+ "repo": "flake-utils",
+ "type": "github"
+ }
+ },
"ioplace-parser": {
"inputs": {
"nixpkgs": [
"openlane2",
+ "nix-eda",
"nixpkgs"
]
},
"locked": {
- "narHash": "sha256-0Lt3DVImH3TpwUh7sDW/6Cxsrmo5DDG+SCuirBFquXs=",
+ "lastModified": 1719837045,
+ "narHash": "sha256-ya2KEXKAIn8oYUi9G9TaUcQAEfGkbENCgXF/V0d/kws=",
"owner": "efabless",
"repo": "ioplace_parser",
- "rev": "f1c163e8184fbce2676a19a1d28c3e6c0b5ddaf2",
+ "rev": "570fd3e352926f57e6eecbb8bd3892a5dec375b7",
"type": "github"
},
"original": {
@@ -37,10 +80,12 @@
"inputs": {
"nixpkgs": [
"openlane2",
+ "nix-eda",
"nixpkgs"
]
},
"locked": {
+ "lastModified": 1713178934,
"narHash": "sha256-1w6HBBE2bWAD0GM98O8WZRmZDW9+EzD0KFvnnH2ho/k=",
"owner": "efabless",
"repo": "libparse-python",
@@ -53,35 +98,55 @@
"type": "github"
}
},
+ "nix-eda": {
+ "inputs": {
+ "nixpkgs": "nixpkgs"
+ },
+ "locked": {
+ "lastModified": 1719830786,
+ "narHash": "sha256-meVPi2d6TI44FjuqQc57Ve3UV1GP12uDVrRfHcACBdg=",
+ "owner": "efabless",
+ "repo": "nix-eda",
+ "rev": "8fd46e08259a761d5078c6c3b8b19dd58bb69e75",
+ "type": "github"
+ },
+ "original": {
+ "owner": "efabless",
+ "repo": "nix-eda",
+ "type": "github"
+ }
+ },
"nixpkgs": {
"locked": {
- "narHash": "sha256-C36QmoJd5tdQ5R9MC1jM7fBkZW9zBUqbUCsgwS6j4QU=",
+ "lastModified": 1717144377,
+ "narHash": "sha256-F/TKWETwB5RaR8owkPPi+SPJh83AQsm6KrQAlJ8v/uA=",
"owner": "nixos",
"repo": "nixpkgs",
- "rev": "c1be43e8e837b8dbee2b3665a007e761680f0c3d",
+ "rev": "805a384895c696f802a9bf5bf4720f37385df547",
"type": "github"
},
"original": {
"owner": "nixos",
- "ref": "nixos-23.11",
+ "ref": "nixos-24.05",
"repo": "nixpkgs",
"type": "github"
}
},
"openlane2": {
"inputs": {
+ "devshell": "devshell",
"flake-compat": "flake-compat",
"ioplace-parser": "ioplace-parser",
"libparse": "libparse",
- "nixpkgs": "nixpkgs",
+ "nix-eda": "nix-eda",
"volare": "volare"
},
"locked": {
- "lastModified": 1715082706,
- "narHash": "sha256-OUaDO8RtK76NN3yuJZIwtel4kuRVmALkXJnTdMIeT8U=",
+ "lastModified": 1719911213,
+ "narHash": "sha256-rd4nqjpwNwqcpKGMx6QN6cX/2MjVt24I5CL9/QE45iM=",
"owner": "efabless",
"repo": "openlane2",
- "rev": "058a93dfacf5352abd06931c3e45fec08cfa468e",
+ "rev": "315e8a220fc7327c4d146b9101b5dc5325862d58",
"type": "github"
},
"original": {
@@ -96,19 +161,35 @@
"openlane2": "openlane2"
}
},
+ "systems": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
"volare": {
"inputs": {
"nixpkgs": [
"openlane2",
+ "nix-eda",
"nixpkgs"
]
},
"locked": {
- "lastModified": 1715078431,
- "narHash": "sha256-w4NLYQwvE/UFgPZDOnKDpagTjKb8FwKWOp3wV/RvPFM=",
+ "lastModified": 1715167549,
+ "narHash": "sha256-QzMKToqiDQzMjBM2TW1VGMUxSLj70Uk4IdJVjIdkd5c=",
"owner": "efabless",
"repo": "volare",
- "rev": "13ccef8de5d8b27311ffd458ac629953784b5224",
+ "rev": "b72ce150b80f67278d4c6b025183fb3941cab993",
"type": "github"
},
"original": {
diff --git a/flake.nix b/flake.nix
index 019b71e21..e25e3b57f 100644
--- a/flake.nix
+++ b/flake.nix
@@ -30,36 +30,39 @@
openlane2,
...
}: let
+ nix-eda = openlane2.inputs.nix-eda;
nixpkgs = openlane2.inputs.nixpkgs;
in {
- # Helper functions
- forAllSystems = function:
- nixpkgs.lib.genAttrs [
- "x86_64-linux"
- "aarch64-linux"
- "x86_64-darwin"
- "aarch64-darwin"
- ] (
- system:
- function (import nixpkgs {
- inherit system;
- overlays = [];
- })
- );
-
# Outputs
- packages = self.forAllSystems (pkgs: let
- callPackage = pkgs.lib.callPackageWith (pkgs // openlane2.packages."${pkgs.system}" // self.packages.${pkgs.system} );
- callPythonPackage = pkgs.lib.callPackageWith (pkgs // pkgs.python3.pkgs // openlane2.packages."${pkgs.system}" // openlane2.inputs.libparse.packages."${pkgs.system}" // openlane2.inputs.volare.packages."${pkgs.system}" // self.packages.${pkgs.system});
- in
- rec {
- # ADD OVERRIDES HERE
- openlane1 = callPythonPackage ./default.nix {};
- default = openlane1;
- }
- // (pkgs.lib.optionalAttrs (pkgs.stdenv.isLinux) {openlane1-docker = callPackage ./docker/docker.nix {
- createDockerImage = openlane2.createDockerImage;
- };}));
+ packages =
+ nix-eda.forAllSystems {
+ current = self;
+ withInputs = [nix-eda openlane2.inputs.libparse openlane2.inputs.volare openlane2];
+ } (util:
+ with util; let
+ self =
+ {
+ openroad-abc = pkgs.openroad-abc.override {
+ # openroad-abc-rev-sha
+ };
+ opensta = pkgs.opensta.override {
+ # opensta-rev-sha
+ };
+ openroad = pkgs.openroad.override {
+ # openroad-rev-sha
+ openroad-abc = self.openroad-abc;
+ opensta = self.opensta;
+ };
+ openlane1 = callPythonPackage ./default.nix {};
+ default = self.openlane1;
+ }
+ // (pkgs.lib.optionalAttrs (pkgs.stdenv.isLinux) {
+ openlane1-docker = callPackage ./docker/docker.nix {
+ createDockerImage = nix-eda.createDockerImage;
+ };
+ });
+ in
+ self);
# devShells = self.forAllSystems (
# pkgs: let
diff --git a/scripts/config/tcl.py b/scripts/config/tcl.py
index 416591a63..9f4b0519c 100755
--- a/scripts/config/tcl.py
+++ b/scripts/config/tcl.py
@@ -313,7 +313,7 @@ def process_config_dict_recursive(config_in: Dict[str, Any], state: State):
whitespace_found = False
comma_found = False
processed = []
- for (i, item) in enumerate(value):
+ for i, item in enumerate(value):
current_key = f"{key}[{i}]"
result = process_scalar(current_key, item, state)
if whitespace_rx.search(result) is not None:
diff --git a/scripts/count_lvs.py b/scripts/count_lvs.py
index 69564b0bf..7dca57abd 100755
--- a/scripts/count_lvs.py
+++ b/scripts/count_lvs.py
@@ -111,7 +111,6 @@ def count_LVS_failures(filename):
if __name__ == "__main__":
-
parser = argparse.ArgumentParser(description="Parses netgen lvs")
parser.add_argument("--file", "-f", required=True)
args = parser.parse_args()
diff --git a/scripts/drc_rosetta.py b/scripts/drc_rosetta.py
index 2ae38df45..46902d42f 100644
--- a/scripts/drc_rosetta.py
+++ b/scripts/drc_rosetta.py
@@ -57,6 +57,7 @@ def magic_to_rdb(
1800 2200
1800 2200
"""
+
# Developed by @ganeshgore
class State(IntEnum):
drc = 0
@@ -81,7 +82,6 @@ class State(IntEnum):
output.write(f"{drcRule[1][:-1]}: {drcRule[0]}\n")
drcNumber = 1
elif state == State.data:
-
cord = [
int(float(i)) * 100 for i in line.strip().replace("um", "").split(" ")
]
diff --git a/scripts/odbpy/diodes.py b/scripts/odbpy/diodes.py
index 066ad54b0..518aba6f1 100644
--- a/scripts/odbpy/diodes.py
+++ b/scripts/odbpy/diodes.py
@@ -322,7 +322,6 @@ def place(
port_protect,
threshold_microns,
):
-
print(f"Design name: {reader.name}")
pp_val = {
diff --git a/scripts/odbpy/wire_lengths.py b/scripts/odbpy/wire_lengths.py
index ea0feb2ee..4ca1a30ec 100644
--- a/scripts/odbpy/wire_lengths.py
+++ b/scripts/odbpy/wire_lengths.py
@@ -83,7 +83,7 @@ def main(report_out, threshold, fail, human_readable, input_db, reader: OdbReade
length_printable = str(to_si(length_microns))
print(f"{net.getName()},{length_printable}", file=f)
- for (net, length_microns) in above_threshold:
+ for net, length_microns in above_threshold:
print(
f"Net {net.getName()} is above the length threshold ({length_microns}/{threshold} μm)."
)
diff --git a/scripts/openroad/common/io.tcl b/scripts/openroad/common/io.tcl
index 0636f5223..6481a3e62 100644
--- a/scripts/openroad/common/io.tcl
+++ b/scripts/openroad/common/io.tcl
@@ -159,24 +159,6 @@ proc read {args} {
sta::parse_key_args "read" args \
keys {-lib_fastest -lib_typical -lib_slowest} \
flags {-no_spefs -set_lib_operating_conditions}
-
- if { [info exists ::env(IO_READ_DEF)] && $::env(IO_READ_DEF) } {
- if { [ catch {read_lef $::env(MERGED_LEF)} errmsg ]} {
- puts stderr $errmsg
- exit 1
- }
- if { [ catch {read_def $::env(CURRENT_DEF)} errmsg ]} {
- puts stderr $errmsg
- exit 1
- }
- } else {
- puts "\[INFO\]: Reading ODB at '$::env(CURRENT_ODB)'…"
- if { [ catch {read_db $::env(CURRENT_ODB)} errmsg ]} {
- puts stderr $errmsg
- exit 1
- }
- }
-
set read_libs_args [list]
if { [info exists keys(-lib_typical)]} {
@@ -197,6 +179,23 @@ proc read {args} {
read_libs {*}$read_libs_args
+ if { [info exists ::env(IO_READ_DEF)] && $::env(IO_READ_DEF) } {
+ if { [ catch {read_lef $::env(MERGED_LEF)} errmsg ]} {
+ puts stderr $errmsg
+ exit 1
+ }
+ if { [ catch {read_def $::env(CURRENT_DEF)} errmsg ]} {
+ puts stderr $errmsg
+ exit 1
+ }
+ } else {
+ puts "\[INFO\]: Reading ODB at '$::env(CURRENT_ODB)'…"
+ if { [ catch {read_db $::env(CURRENT_ODB)} errmsg ]} {
+ puts stderr $errmsg
+ exit 1
+ }
+ }
+
read_sdc_wrapper
if { ![info exist flags(-no_spefs)] } {
diff --git a/scripts/padframe_generator.py b/scripts/padframe_generator.py
index 6020bae8f..14af85df1 100755
--- a/scripts/padframe_generator.py
+++ b/scripts/padframe_generator.py
@@ -99,7 +99,6 @@ class Dialog(tkinter.Toplevel):
def __init__(
self, parent, message=None, title=None, seed=None, border="blue", **kwargs
):
-
tkinter.Toplevel.__init__(self, parent)
self.transient(parent)
@@ -154,7 +153,6 @@ def buttonbox(self):
# Standard button semantics
def ok(self, event=None):
-
if not self.validate():
self.initial_focus.focus_set() # put focus back
return
@@ -165,7 +163,6 @@ def ok(self, event=None):
self.cancel()
def cancel(self, event=None):
-
# Put focus back to the parent window
self.parent.focus_set()
self.destroy()
@@ -378,7 +375,6 @@ def init_gui(self):
pane.paneconfig(self.toppane, stretch="first")
def init_data(self):
-
self.vlogpads = []
self.corecells = []
self.Npads = []
@@ -965,7 +961,6 @@ def populate(self, level):
height = self.ury - self.lly
for pad in allpads:
-
llx = pad["llx"]
lly = height - pad["lly"]
urx = pad["urx"]
@@ -1123,7 +1118,6 @@ def populate(self, level):
coreury = self.ury
for cell in self.coregroup:
-
if "llx" not in cell:
# Error message for this was handled above
continue
@@ -2369,7 +2363,6 @@ def writeconfig(self):
# height *= 1.4
if self.keep_cfg == False or not os.path.exists(mag_path + "/padframe.cfg"):
-
if os.path.exists(mag_path + "/padframe.cfg"):
# Copy the previous padframe.cfg file to a backup. In case something
# goes badly wrong, this should be the only file overwritten, and can
@@ -2600,7 +2593,6 @@ def readplacement(self, precheck=False):
mag_path = self.projectpath + "/mag"
if not os.path.isfile(mag_path + "/" + self.project + ".def"):
if os.path.isfile(mag_path + "/" + self.project + ".mag"):
-
# Create a DEF file from the layout
with open(mag_path + "/pfg_write_def.tcl", "w") as ofile:
print("drc off", file=ofile)
@@ -2623,7 +2615,6 @@ def readplacement(self, precheck=False):
os.remove(mag_path + "/pfg_write_def.tcl")
elif not os.path.isfile(mag_path + "/core.def"):
-
# With no other information available, copy the corecells
# (from the verilog file) into the coregroup list.
# Position all core cells starting at the padframe top left
@@ -2651,7 +2642,6 @@ def readplacement(self, precheck=False):
nextlly = corelly
for cell in self.corecells:
-
testllx = locllx + cell["width"]
if testllx > coreurx:
locllx = corellx
diff --git a/scripts/report/get_best.py b/scripts/report/get_best.py
index a2dbfd3b3..bc955a319 100755
--- a/scripts/report/get_best.py
+++ b/scripts/report/get_best.py
@@ -218,7 +218,6 @@ def save_top_results(results_dictionary, output_file, header):
def findIdx(header, column):
-
for idx in range(len(header)):
if header[idx] == column:
return int(idx)
diff --git a/scripts/tcl_commands/all.tcl b/scripts/tcl_commands/all.tcl
index 28bdb587d..bee91da25 100755
--- a/scripts/tcl_commands/all.tcl
+++ b/scripts/tcl_commands/all.tcl
@@ -578,21 +578,26 @@ proc prep {args} {
load_overrides -process_info_only $arg_values(-override_env)
}
- if { ! [info exists ::env(PDK_ROOT)] || $::env(PDK_ROOT) == "" } {
- puts_err "PDK_ROOT is not specified. Please make sure you have it set."
- exit -1
- } else {
- puts_info "PDK Root: $::env(PDK_ROOT)"
+ if { ! [info exists ::env(PDK)] } {
+ set ::env(PDK) "sky130A"
}
+ puts_info "Process Design Kit: $::env(PDK)"
- if { ! [info exists ::env(PDK)] } {
- puts_err "PDK is not specified."
- exit -1
- } else {
- puts_info "Process Design Kit: $::env(PDK)"
- puts_verbose "Setting PDKPATH to $::env(PDK_ROOT)/$::env(PDK)"
- set ::env(PDKPATH) $::env(PDK_ROOT)/$::env(PDK)
+ if { ! [info exists ::env(PDK_ROOT)] || $::env(PDK_ROOT) == "" } {
+ set pdk_family [string range $::env(PDK) 0 [expr [string length $::env(PDK)]-2]]
+ set opdks_version [exec python3 $::env(OPENLANE_ROOT)/dependencies/tool.py open_pdks -f commit]
+ if { [catch {exec volare path --pdk $pdk_family $opdks_version} volare_pdk_root] } {
+ puts_err "PDK_ROOT is not specified. Please make sure you have it set."
+ exit -1
+ } else {
+ set ::env(PDK_ROOT) $volare_pdk_root
+ puts_info "Set PDK Root using Volare. If you haven't downloaded it yet, try 'volare fetch'."
+ }
}
+ puts_info "PDK Root: $::env(PDK_ROOT)"
+
+ puts_verbose "Setting PDKPATH to $::env(PDK_ROOT)/$::env(PDK)"
+ set ::env(PDKPATH) $::env(PDK_ROOT)/$::env(PDK)
## 3. PDK-Specific Config
if { [info exists ::env(STD_CELL_LIBRARY)] } {
diff --git a/scripts/topModuleGen/src/TopModuleGen.py b/scripts/topModuleGen/src/TopModuleGen.py
index 2dba55797..dbc270ade 100644
--- a/scripts/topModuleGen/src/TopModuleGen.py
+++ b/scripts/topModuleGen/src/TopModuleGen.py
@@ -116,6 +116,8 @@
padFrameHeader = "chip_io padframe(\n"
padFrameHeaderDefinition = "module chip_io(\n"
padFrameWires = ""
+
+
# parsePads is responsible for parsing the pads except for power/corner pads
def parsePads():
global topModuleHeader
diff --git a/scripts/utils/utils.tcl b/scripts/utils/utils.tcl
index 5269ff78e..d66b0b973 100755
--- a/scripts/utils/utils.tcl
+++ b/scripts/utils/utils.tcl
@@ -512,7 +512,7 @@ proc manipulate_layout {args} {
set_if_unset arg_values(-indexed_log) /dev/null
set_if_unset arg_values(-input) $::env(CURRENT_ODB)
set_if_unset arg_values(-output) $arg_values(-input)
- set_if_unset arg_values(-output_def) /dev/null
+ set_if_unset arg_values(-output_def) [file rootname $arg_values(-output)].def
run_odbpy_script\
{*}$args \
diff --git a/tests/1935-cts-crash/interactive.tcl b/tests/1935-cts-crash/interactive.tcl
deleted file mode 100644
index cab7b4f2c..000000000
--- a/tests/1935-cts-crash/interactive.tcl
+++ /dev/null
@@ -1,3 +0,0 @@
-exec bash -c "set -e && \
- cd [file dirname [file normalize [info script]]]/reproducible && \
- tar xvf issue.tar.gz && cd issue_reproducible && bash run.sh"
diff --git a/tests/1935-cts-crash/reproducible b/tests/1935-cts-crash/reproducible
deleted file mode 120000
index d48c95737..000000000
--- a/tests/1935-cts-crash/reproducible
+++ /dev/null
@@ -1 +0,0 @@
-../../designs/ci/reproducibles/1935/
\ No newline at end of file
From 73cbe2bf78ef87fbf3ac55c34bc7c5515a1fdc00 Mon Sep 17 00:00:00 2001
From: Matt Liberty
Date: Thu, 11 Jul 2024 04:49:08 -0700
Subject: [PATCH 5/6] Update black to 24.3.0 to fix GH security alert (#2139)
Signed-off-by: Matt Liberty
---
dependencies/includedyaml/__init__.py | 1 +
dependencies/includedyaml/constructor.py | 1 +
dependencies/includedyaml/emitter.py | 6 +++---
dependencies/tool.py | 14 ++++++++------
requirements_lint.txt | 2 +-
5 files changed, 14 insertions(+), 10 deletions(-)
diff --git a/dependencies/includedyaml/__init__.py b/dependencies/includedyaml/__init__.py
index 9bd754e9a..3ab3c4649 100644
--- a/dependencies/includedyaml/__init__.py
+++ b/dependencies/includedyaml/__init__.py
@@ -17,6 +17,7 @@
import io
+
# ------------------------------------------------------------------------------
# XXX "Warnings control" is now deprecated. Leaving in the API function to not
# break code that uses it.
diff --git a/dependencies/includedyaml/constructor.py b/dependencies/includedyaml/constructor.py
index 1de226faf..e7514be94 100644
--- a/dependencies/includedyaml/constructor.py
+++ b/dependencies/includedyaml/constructor.py
@@ -856,6 +856,7 @@ def set_python_instance_state(self, instance, state):
UnsafeConstructor.construct_python_object_apply,
)
+
# Constructor is same as UnsafeConstructor. Need to leave this in place in case
# people have extended it directly.
class Constructor(UnsafeConstructor):
diff --git a/dependencies/includedyaml/emitter.py b/dependencies/includedyaml/emitter.py
index 2f6311cbe..e4700f86f 100644
--- a/dependencies/includedyaml/emitter.py
+++ b/dependencies/includedyaml/emitter.py
@@ -834,9 +834,9 @@ def analyze_scalar(self, scalar):
# Spaces followed by breaks, as well as special character are only
# allowed for double quoted scalars.
if space_break or special_characters:
- allow_flow_plain = (
- allow_block_plain
- ) = allow_single_quoted = allow_block = False
+ allow_flow_plain = allow_block_plain = allow_single_quoted = allow_block = (
+ False
+ )
# Although the plain scalar writer supports breaks, we never emit
# multiline plain scalars.
diff --git a/dependencies/tool.py b/dependencies/tool.py
index d8c30c721..599cf9d0f 100644
--- a/dependencies/tool.py
+++ b/dependencies/tool.py
@@ -84,12 +84,14 @@ def from_metadata_yaml(metadata_yaml: str) -> Dict[str, "Tool"]:
commit=tool["commit"],
build_script=tool.get("build") or "",
default_branch=tool.get("default_branch") or None,
- in_container=tool["in_container"]
- if tool.get("in_container") is not None
- else True,
- in_install=tool["in_install"]
- if tool.get("in_install") is not None
- else True,
+ in_container=(
+ tool["in_container"]
+ if tool.get("in_container") is not None
+ else True
+ ),
+ in_install=(
+ tool["in_install"] if tool.get("in_install") is not None else True
+ ),
pdk=tool.get("pdk") or False,
)
return final_dict
diff --git a/requirements_lint.txt b/requirements_lint.txt
index ccbde4010..65f5c3882 100644
--- a/requirements_lint.txt
+++ b/requirements_lint.txt
@@ -1,3 +1,3 @@
-black~=22.3.0
+black~=24.3.0
flake8~=4.0.1
flake8-no-implicit-concat==0.3.3
From 7ee92859d6819421acd767210b990fb9f8f61aa9 Mon Sep 17 00:00:00 2001
From: Kareem Farid
Date: Thu, 18 Jul 2024 13:40:22 +0300
Subject: [PATCH 6/6] Increase banner size for OpenLane 2 (#2137)
~ Increases banner size for OpenLane 2, now uses a PNG rendered at 1200 API on macOS for consistency
~ Updated Flow Architecture Document
Co-authored-by: Mohamed Gaber
---
README.md | 2 +-
docs/_static/eco_flow.png | Bin 154809 -> 0 bytes
docs/_static/eco_results.png | Bin 26288 -> 0 bytes
docs/_static/flow.png | Bin 0 -> 169721 bytes
docs/_static/flow_v1.png | Bin 151663 -> 0 bytes
docs/_static/ol2_banner.png | Bin 0 -> 132259 bytes
docs/_static/ol2_banner.svg | 111 ++++++++++++++++++++++-------------
docs/_static/striVe.jpeg | Bin 360882 -> 0 bytes
docs/source/flow_overview.md | 105 +++++++++------------------------
9 files changed, 100 insertions(+), 118 deletions(-)
delete mode 100644 docs/_static/eco_flow.png
delete mode 100644 docs/_static/eco_results.png
create mode 100644 docs/_static/flow.png
delete mode 100644 docs/_static/flow_v1.png
create mode 100644 docs/_static/ol2_banner.png
delete mode 100644 docs/_static/striVe.jpeg
diff --git a/README.md b/README.md
index 61f9bf6b4..68046fb62 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
-
+
diff --git a/docs/_static/eco_flow.png b/docs/_static/eco_flow.png
deleted file mode 100644
index 5986d7fcbf4a498085f4bb83162f7776fcf31fb2..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 154809
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
z
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