# index.html.md # Welcome to OpenROAD’s documentation! The OpenROAD (“Foundations and Realization of Open, Accessible Design”) project was launched in June 2018 within the DARPA IDEA program. OpenROAD aims to bring down the barriers of cost, expertise and unpredictability that currently block designers’ access to hardware implementation in advanced technologies. The project team (Qualcomm, Arm and multiple universities and partners, led by UC San Diego) is developing a fully autonomous, open-source tool chain for digital SoC layout generation, focusing on the RTL-to-GDSII phase of system-on-chip design. Thus, OpenROAD holistically attacks the multiple facets of today’s design cost crisis: engineering resources, design tool licenses, project schedule, and risk. The IDEA program targets no-human-in-loop (NHIL) design, with 24-hour turnaround time and zero loss of power-performance-area (PPA) design quality. The NHIL target requires tools to adapt and auto-tune successfully to flow completion, without (or, with minimal) human intervention. Machine intelligence augments human expertise through efficient modeling and prediction of flow and optimization outcomes throughout the synthesis, placement and routing process. This is complemented by development of metrics and machine learning infrastructure. The 24-hour runtime target implies that problems must be strategically decomposed throughout the design process, with clustered and partitioned subproblems being solved and recomposed through intelligent distribution and management of computational resources. This ensures that the NHIL design optimization is performed within its available `[threads * hours]` “box” of resources. Decomposition that enables parallel and distributed search over cloud resources incurs a quality-of-results loss, but this is subsequently recovered through improved flow predictability and enhanced optimization. For a technical description of the OpenROAD flow, please refer to our DAC-2019 paper: [Toward an Open-Source Digital Flow: First Learnings from the OpenROAD Project](https://vlsicad.ucsd.edu/Publications/Conferences/371/c371.pdf). The paper is also available from [ACM Digital Library](https://dl.acm.org/doi/10.1145/3316781.3326334). Other publications and presentations are linked [here](https://theopenroadproject.org/publications/). ## Documentation The OpenROAD Project has two releases: - Application ([github](https://github.com/The-OpenROAD-Project/OpenROAD)) ([docs](main/README.md)): The application is a standalone binary for digital place and route that can be used by any other RTL-GDSII flow controller. - Flow ([github](https://github.com/The-OpenROAD-Project/OpenROAD-flow-scripts)) ([docs](https://openroad-flow-scripts.readthedocs.io/en/latest/)): This is the native OpenROAD flow that consists of a set of integrated scripts for an autonomous RTL-GDSII flow using OpenROAD and other open-source tools. ## Supported Operating Systems Note that depending on the installation method, we have varying levels of support for various operating systems. Legend: - `Y` for supported. - `-` for unsupported. | Operating System | Local Installation | Prebuilt Binaries | Docker Installation | Windows Subsystem for Linux | |----------------------|----------------------|---------------------|-----------------------|-------------------------------| | Debian 12 | `Y` | `Y` | `Y` | `-` | | Debian 13 | `Y` | `Y` | `Y` | `-` | | Ubuntu 22.04 | `Y` | `Y` | `Y` | `-` | | Ubuntu 24.04 | `Y` | `Y` | `Y` | `-` | | Ubuntu 26.04 | `Y` | `Y` | `Y` | `-` | | RHEL 8/9 | `Y` | `-` | `Y` | `-` | | Rocky 8 | `Y` | `-` | `Y` | `-` | | Rocky 9 | `Y` | `-` | `Y` | `-` | | macOS | `Y` | `-` | `Y` | `-` | | Windows 10 and above | `-` | `-` | `Y` | `Y` | ## Code of conduct Please read our code of conduct [here](main/CODE_OF_CONDUCT.md). ## How to contribute If you are willing to **contribute**, see the [Getting Involved](contrib/GettingInvolved.md) section. If you are a **developer** with EDA background, learn more about how you can use OpenROAD as the infrastructure for your tools in the [Developer Guide](contrib/DeveloperGuide.md) section. OpenROAD uses Git for version control and contributions. Get familiarised with a quickstart tutorial to contribution [here](contrib/GitGuide.md). ## How to get in touch We maintain the following channels for communication: - Project homepage and news: [https://theopenroadproject.org](https://theopenroadproject.org) - Twitter: [https://twitter.com/OpenROAD_EDA](https://twitter.com/OpenROAD_EDA) - Issues and bugs: - OpenROAD: [https://github.com/The-OpenROAD-Project/OpenROAD/issues](https://github.com/The-OpenROAD-Project/OpenROAD/issues) - Discussions: - OpenROAD: [https://github.com/The-OpenROAD-Project/OpenROAD/discussions](https://github.com/The-OpenROAD-Project/OpenROAD/discussions) - Inquiries: openroad@ucsd.edu See also our [FAQs](user/FAQS.md). ## Site Map * [Getting Started with OpenROAD](main/README.md) * [About OpenROAD](main/README.md#about-openroad) * [OpenROAD Mission](main/README.md#openroad-mission) * [Getting Started with OpenROAD-flow-scripts](main/README.md#getting-started-with-openroad-flow-scripts) * [GUI](main/README.md#gui) * [Floorplan](main/README.md#floorplan) * [Automatic Hierarchical Macro Placement](main/README.md#automatic-hierarchical-macro-placement) * [Placement Congestion Visualization](main/README.md#placement-congestion-visualization) * [CTS](main/README.md#cts) * [Routing](main/README.md#routing) * [PDK Support](main/README.md#pdk-support) * [Open-Source PDKs](main/README.md#open-source-pdks) * [Proprietary PDKs](main/README.md#proprietary-pdks) * [Tapeouts](main/README.md#tapeouts) * [OpenTitan SoC on GF12LP - Physical design and optimization using OpenROAD](main/README.md#opentitan-soc-on-gf12lp-physical-design-and-optimization-using-openroad) * [Continuous Tapeout Integration into CI](main/README.md#continuous-tapeout-integration-into-ci) * [Build OpenROAD](main/README.md#build-openroad) * [Third-party dependencies: submodules vs. Bazel BCR](main/README.md#third-party-dependencies-submodules-vs-bazel-bcr) * [Regression Tests](main/README.md#regression-tests) * [Run](main/README.md#run) * [Git Quickstart](main/README.md#git-quickstart) * [Understanding Warning and Error Messages](main/README.md#understanding-warning-and-error-messages) * [License](main/README.md#license) * [OpenROAD User Guide](main/README2.md) * [About OpenROAD](main/README2.md#about-openroad) * [OpenROAD Mission](main/README2.md#openroad-mission) * [Getting Started with OpenROAD-flow-scripts](main/README2.md#getting-started-with-openroad-flow-scripts) * [GUI](main/README2.md#gui) * [Floorplan](main/README2.md#floorplan) * [Automatic Hierarchical Macro Placement](main/README2.md#automatic-hierarchical-macro-placement) * [Placement Congestion Visualization](main/README2.md#placement-congestion-visualization) * [CTS](main/README2.md#cts) * [Routing](main/README2.md#routing) * [PDK Support](main/README2.md#pdk-support) * [Open-Source PDKs](main/README2.md#open-source-pdks) * [Proprietary PDKs](main/README2.md#proprietary-pdks) * [Tapeouts](main/README2.md#tapeouts) * [OpenTitan SoC on GF12LP - Physical design and optimization using OpenROAD](main/README2.md#opentitan-soc-on-gf12lp-physical-design-and-optimization-using-openroad) * [Continuous Tapeout Integration into CI](main/README2.md#continuous-tapeout-integration-into-ci) * [Build OpenROAD](main/README2.md#build-openroad) * [Third-party dependencies: submodules vs. Bazel BCR](main/README2.md#third-party-dependencies-submodules-vs-bazel-bcr) * [Regression Tests](main/README2.md#regression-tests) * [Run](main/README2.md#run) * [Git Quickstart](main/README2.md#git-quickstart) * [Understanding Warning and Error Messages](main/README2.md#understanding-warning-and-error-messages) * [License](main/README2.md#license) * [Getting Involved](contrib/GettingInvolved.md) * [Licensing Contributions](contrib/GettingInvolved.md#licensing-contributions) * [Contributing Scripts and Code](contrib/GettingInvolved.md#contributing-scripts-and-code) * [Questions](contrib/GettingInvolved.md#questions) * [Code of Conduct](main/CODE_OF_CONDUCT.md) * [Our Pledge](main/CODE_OF_CONDUCT.md#our-pledge) * [Our Standards](main/CODE_OF_CONDUCT.md#our-standards) * [Enforcement Responsibilities](main/CODE_OF_CONDUCT.md#enforcement-responsibilities) * [Scope](main/CODE_OF_CONDUCT.md#scope) * [Enforcement](main/CODE_OF_CONDUCT.md#enforcement) * [Enforcement Guidelines](main/CODE_OF_CONDUCT.md#enforcement-guidelines) * [1. Correction](main/CODE_OF_CONDUCT.md#correction) * [2. Warning](main/CODE_OF_CONDUCT.md#warning) * [3. Temporary Ban](main/CODE_OF_CONDUCT.md#temporary-ban) * [4. Permanent Ban](main/CODE_OF_CONDUCT.md#permanent-ban) * [Attribution](main/CODE_OF_CONDUCT.md#attribution) * [FAQs](user/FAQS.md) * [How can I contribute?](user/FAQS.md#how-can-i-contribute) # index.html.md # Tutorials ## OpenROAD Flow Scripts Tutorial Flow tutorial can be accessed from OpenROAD Flow Scripts documentation [here](https://openroad-flow-scripts.readthedocs.io/en/latest/tutorials/FlowTutorial.html). # 0118.html.md # Helpful Information Do refer to the [GUI guide](https://openroad-flow-scripts.readthedocs.io/en/latest/tutorials/FlowTutorial.html#openroad-gui) and [global routing debugging tips](https://openroad-flow-scripts.readthedocs.io/en/latest/tutorials/FlowTutorial.html#debugging-problems-in-global-routing). # 0119.html.md # Helpful Information Do refer to the [GUI guide](https://openroad-flow-scripts.readthedocs.io/en/latest/tutorials/FlowTutorial.html#openroad-gui) and [global routing debugging tips](https://openroad-flow-scripts.readthedocs.io/en/latest/tutorials/FlowTutorial.html#debugging-problems-in-global-routing). # AGENTS.html.md # OpenROAD - AI agent context This file provides project-specific guidance for AI agent sessions working on the OpenROAD codebase. ## Quick Reference Detailed guides are in `docs/agents/` subdirectory: - **Build Pitfalls**: See `docs/agents/build.md` - **Testing Guide**: See `docs/agents/testing.md` - **Git & CI**: See `docs/agents/ci.md` - **Coding Patterns**: See `docs/agents/coding.md` ## Critical Rules 1. **Ask before modifying `src/sta/` files** – OpenSTA is managed upstream (`Sdc.cc`, `Power.cc`, `Sdc.tcl`, etc.). Prefer fixes in OpenROAD code (e.g., src/dbSta/, src/rsz/) when possible. 2. Run `clang-format -i ` for C++ files before commit. **NEVER** for `src/sta/*` and `*.i` files. 3. **Always use `git commit -s`** for DCO compliance. 4. When amending submodule commits, parent repo submodule reference must also be updated via `git submodule update --init --recursive`. It is needed after any merge/pull. 5. **Trace bugs upstream** – when a bug appears in output (e.g., Verilog), find the data creation point (e.g., `buffer_ports`, `remove_buffers`), not the serialization point (e.g., `VerilogWriter`). ## AI Agent Skills Skills are located in `.agents/skills/` (with `.claude/skills` symlink for Claude Code). | Skill | Purpose | Invocation | |----------------|------------------------------------------------------------------------|------------------------------------| | `triage-issue` | Reproduce bug and minimize test case with whittle.py | `/triage-issue ` | | `fix-bug` | Trace root cause, implement fix, create tests, prepare commit | `/fix-bug ` | | `add-test` | Add integration/unit tests with dual CMake+Bazel registration | `/add-test [description]` | | `review-pr` | Draft local PR review notes (correctness > QoR > testing); human posts | `/review-pr ` | # Bazel-breaking-changes.html.md # Handling breaking changes between OpenROAD and ORFS ORFS occasionally requires an update when OpenROAD has changed in some breaking way(such as when retiring a feature), but it is not common. Normally a new feature is added to OpenROAD, then ORFS afterwards can be updated to use the new feature, or if ORFS has a breaking change for bazel-orfs, ORFS and bazel-orfs can be updated together in OpenROAD. ## Add interim conditional code to ORFS One way to handle this is to add conditional code to ORFS and clean up the conditional code when it is no longer needed. ```tcl try { new_command -option value } trap {ANY} {e} { puts "new_command failed, falling back to old_command" old_command -option value } ``` ## Publish a Docker image with the changes To update MODULE.bazel to point to a new ORFS docker image and bazel-orfs in OpenROAD, run bazelisk run @bazel-orfs//:bump, then use `git add -p .` to pick what you want to commit. Then, to create an OpenROAD PR which uses an interim ORFS Docker image: 1. publish a docker image of ORFS with the changes and the old broken OpenROAD, but don’t update ORFS master. OpenROAD uses the ORFS docker image, with the bazel compiled OpenROAD 2. point MODULE.bazel to this docker image 3. create a PR for OpenROAD. This PR will run with HEAD from OpenROAD and the ORFS image you published in 1. 4. Upgrade the OpenROAD submodule in ORFS and publish a new Docker image 5. Run `bazelisk run @bazel-orfs//:bump` again # Bazel-caching.html.md # Bazel Developer Guide: Caching This document provides instructions for developers on how to use Bazel’s caching features to accelerate local builds. ## Caching Strategy Overview Our Bazel setup uses a multi-layered caching strategy to provide optimal performance for different types of users: 1. **Local Cache (Default):** All builds use a local on-disk cache by default. This provides a speed-up for incremental builds without requiring any special configuration. 2. **Remote Cache:** We maintain a remote cache server at `https://bazel.precisioninno.com`. The contents of the cache are generated by the CI for all branches. This allows anyone that wishes to build OpenROAD locally and CI jobs to share build artifacts, dramatically reducing build times. All non-CI builds have **read-only** access to the remote cache. --- ### 1. Local On-Disk Cache All builds use a local on-disk cache to speed up incremental builds. The default location is `~/.cache/bazel-disk-cache` and is set inside the repo’s `.bazelrc` file. You can override this config by setting a systemwide or home `.bazelrc` file. See more at [Write bazelrc configuration files](https://bazel.build/run/bazelrc) or by passing the `--disk_cache` argument to your bazel commands. #### Using a `user.bazelrc` file For more advanced customization, you can create a `user.bazelrc` file in the root of the repository. This file is ignored by Git and can be used to override any default settings. For example, you could use it to specify a different remote cache or to enable features for your local builds. Example `user.bazelrc`: ```default build --remote_cache=https://storage.googleapis.com/my-personal-cache build --remote_upload_local_results=true build --disk_cache=~/my-disk-cache ``` For a full list of command-line options, refer to the [Bazel Command-Line Reference](https://bazel.build/reference/command-line-reference). --- ### 2. Remote Cache Access All builds are configured to use our remote cache for shared build artifacts. This is configured in the main `.bazelrc` file with the following settings: ```default build --remote_cache=https://bazel.precisioninno.com build --remote_cache_compression=true build --remote_upload_local_results=false ``` This means that all developer builds will **read from** the public remote cache but **cannot write to** it. This provides significant build speed improvements without requiring any authentication. #### Disabling the Remote Cache If you encounter issues with the remote cache, you can disable it by overriding the `--remote_cache` flag. You can do this in your `user.bazelrc` file or by passing the flag directly to your Bazel command: **Option 1: Using `user.bazelrc`** Add the following line to your `user.bazelrc` file: ```default build --remote_cache= ``` **Option 2: Command-Line Flag** Pass an empty `--remote_cache` flag to your build command: ```bash bazel build --remote_cache= //... ``` ## This will cause Bazel to fall back to using only the local on-disk cache for the build ### 3. CI Access (Jenkins Pipeline) The Jenkins pipeline uses a specific configuration for its builds. This is primarily for informational purposes, as developers will not typically use the `ci` configuration locally. * All CI builds use the `--config=ci` profile. * The `ci` config enables **read/write** access to the remote cache, populating it with the latest artifacts for **all branches**. * It also disables the local disk cache for CI builds to ensure clean builds. Here are the relevant settings from `.bazelrc`: ```default build:ci --remote_download_minimal build:ci --remote_upload_local_results=true build:ci --disk_cache= ``` --- ## “Build without the Bytes” (BwoB) Our configurations include performance optimizations to reduce network traffic and improve build speeds using the “Build without the Bytes” (BwoB) feature, which minimizes the download of build artifacts from the remote cache. There are two main BwoB settings: * `--remote_download_toplevel`: This is the default setting in Bazel. It downloads only the outputs of the top-level targets you specify in your build command. This is ideal for interactive development, where you need to use the final build artifacts (e.g., run a binary or inspect a generated file). * `--remote_download_minimal`: This is a more aggressive setting that downloads only the artifacts essential for the build to continue. It is primarily intended for CI environments, where you are only concerned with the success or failure of a build, not the artifacts themselves. Our configurations use the default (`--remote_download_toplevel`) for developer builds and `--remote_download_minimal` for CI builds (`ci`) to provide the best balance of performance and usability for each environment. # Bazel-developer-activities.html.md # Bazel Developer Activities and `.bzl` Training Guide This guide maps common OpenROAD developer activities to Bazel workflows and provides practical training steps for reading and maintaining `.bzl` (Starlark) files. It is intended for contributors who already build and test OpenROAD, and want to become productive with Bazel internals and review-ready changes. ## Scope This document covers: - day-to-day developer activities - where to find relevant Bazel logic in the repository - how to approach `.bzl` and Starlark changes safely - minimal commands to verify changes locally before opening a PR For general Bazel usage (running tests, build configs, caching, ORFS details), see: - [Testing local changes with Bazel](Bazel.md) - [Bazel targets](Bazel-targets.md) - [Bazel Developer Guide: Caching](Bazel-caching.md) - [Handling breaking changes between OpenROAD and ORFS](Bazel-breaking-changes.md) --- ## Repository areas to know You will work mostly in: - `BUILD.bazel` / `BUILD` files: target declarations - `MODULE.bazel` and `MODULE.bazel.lock`: dependency/module management - `.bazelrc`: shared Bazel flags and configs - `bazel/*.bzl`: shared Starlark macros and helpers used across targets - `test/regression.bzl` and `test/orfs/**/*.bzl`: regression and ORFS-related Starlark logic Treat `.bzl` files as code: keep changes small, reviewable, and tested. --- ## Activity matrix (what developers do most often) ## 1) Modify C++/Tcl/Python code and run fast local checks Typical flow: 1. make code change 2. run focused tests in affected subtree 3. run broader checks before PR Examples: ```none bazelisk test //src//... ``` When broad integration confidence is needed: ```none bazelisk test //... ``` Use narrow scope first; widen only as confidence increases. ## 2) Add or update a target in a `BUILD` file Common tasks: - add a new test target - add data dependencies - split/reuse libraries for better build graph hygiene Recommended process: 1. copy a nearby target pattern 2. keep visibility minimal 3. avoid over-exporting internals 4. run only the new/changed target first 5. then run subtree tests Example validation steps: ```none bazelisk query 'kind(test, //src//...)' bazelisk test //src//test: ``` The test target name is derived from the test file name with a suffix added based on type: Tcl tests get `_tcl` and Python tests get `_py`. For example, `src/grt/test/fastroute.tcl` becomes target `fastroute_tcl`, so you would run: ```none bazelisk test //src/grt/test:fastroute_tcl ``` Use the `bazelisk query` command above to list all test targets and find the exact name for any test in the subtree. ## 3) Change shared build logic in `.bzl` This has wider blast radius than editing one `BUILD` file. Safe process: 1. isolate the macro/rule behavior you need to change 2. preserve backward-compatible call patterns where possible 3. test one direct consumer target first 4. test additional representative consumers 5. run a broader sweep before PR Suggested progression: - one directly affected target - one unrelated consumer (sanity against regressions) - affected subtree tests - optional full `src/...` or `...` based on change scope ## 4) Update ORFS/Bazel-ORFS coupling If your change touches integration boundaries: - verify OpenROAD side and ORFS assumptions together - use the documented ORFS debug/issue-generation workflow in `test/orfs/README.md` - run at least affected ORFS smoke tests before PR ## 5) Update Bazel module/dependency state When bumping module inputs: - prefer project-documented bump flow - review both `MODULE.bazel` and lock updates - keep diffs minimal and intentional - verify representative build/tests after update --- ## `.bzl` training path (practical, repo-oriented) ## Step 1: Read Starlark with intent When reading a `.bzl` file, identify: - exported symbols (macros/rules) used by `BUILD` files - inputs (attrs/kwargs) and defaults - what target(s) the macro expands into - implicit outputs, tags, and toolchain assumptions Focus first on call sites in nearby `BUILD` files. ## Step 2: Learn by tracing one macro end-to-end Pick one macro used in your area and trace: 1. `BUILD` call site 2. macro parameters and normalization 3. final native rules emitted 4. resulting target graph via query This builds intuition faster than reading Starlark in isolation. ## Step 3: Make no-op/refactor-safe edits first Before behavior changes, practice with small, review-safe edits: - variable naming cleanup - comments clarifying non-obvious behavior - extracting small helper functions without semantic changes Then run representative tests. This gives confidence in your local loop and reduces risk. ## Step 4: Introduce behavior changes behind clear conditions For real logic changes: - keep old path available when practical - gate new behavior with explicit kwargs or clear branch conditions - avoid hidden behavior changes to unrelated consumers ## Step 5: Validate like a maintainer For `.bzl` changes, do not stop at one passing target. Validate across: - direct consumer(s) - at least one unrelated consumer - broader subtree or project-level tests proportional to blast radius --- ## Code review checklist for Bazel / `.bzl` changes Before opening a PR, verify: - change is minimal and scoped to one intent - `BUILD`/`.bzl` naming is clear and consistent with nearby code - no accidental visibility broadening - test target selection matches changed area - representative tests passed locally - docs updated when behavior/workflow changed For larger `.bzl` changes, include a short “impact summary” in PR description: - what changed - who consumes it - what was tested --- ## Common pitfalls and how to avoid them - **Changing shared macros without representative tests**
\\\\ Always test more than one consumer. - **Overusing broad target patterns too early**
\\\\ Start narrow (`//src//...`), then widen. - **Conflating host/target configs when debugging**
\\\\ Use guidance in [Bazel targets](Bazel-targets.md) and [Bazel.md](Bazel.md). - **Mixing unrelated cleanup with behavioral changes**
\\\\ Separate commits improve review quality and rollback safety. - **Unclear PR validation evidence**
\\\\ Include exact commands you ran and the scope they cover. --- ## Suggested onboarding exercises for new developers These are low-risk training tasks that build Bazel confidence: 1. run and list tests in a single tool subtree 2. add a tiny test target in a local branch and validate it 3. trace one `.bzl` macro from call site to emitted rules 4. make a non-functional clarity edit in `.bzl` and confirm no regressions 5. document your local validation commands in PR style --- ## Minimal verification template (copy/paste for PR notes) Use and adapt this in your PR description: ```none Scope: - Validation: - bazelisk test //src//test: - bazelisk test //src//... - bazelisk test //src/... Notes: - ``` Keep validation proportional to change scope. --- ## When to ask for help Ask early if: - you are unsure whether a `.bzl` macro is shared across many consumers - a change requires module/toolchain decisions beyond local context - target/config behavior is surprising across `build` vs `test` A short design note in the PR discussion is better than a large speculative change. --- ## Summary For OpenROAD Bazel work, reliability comes from: - small scoped edits - understanding call site → macro → emitted rule flow - representative validation across consumers - explicit, reproducible test evidence in PRs If you follow this workflow, your `.bzl` and Bazel changes are much more likely to be easy to review and safe to merge. # Bazel-targets.html.md # Bazel targets Bazel is a cross compilation system where `cfg=exec` is host and `cfg=target` is the microcontroller in a host compiler targeting a microcontroller scenario. Although there is no clear host and target scenario for OpenROAD, it is all host, the host/target concetps of Bazel brings some [surprises](https://en.wikipedia.org/wiki/Principle_of_least_astonishment) now and then when working with OpenROAD. ## What is host and what is target in an OpenROAD context? Not surprisingly, the command below builds the `cfg=target` configuration: ```none bazelisk build -c opt :openroad ``` However, the tests run on the host: ```none bazelisk test ... ``` This, means that if one where to run, the commands below, OpenROAD would be built twice, first for `cfg=exec` and then for `cfg=target`: ```none bazelisk build -c opt :openroad bazelisk test ... ``` ## Visualizing configurations and dependencies This command will visualize the dependencies on `:openroad`: ```none bazelisk cquery -c opt --output=graph 'allpaths(//..., //:openroad)' | xdot /dev/stdin ``` ![alt text](user/openroad-all-dependencies.png) ![alt text](user/openroad-cfg-exec.png) To list configurations, noting `cfg=exec` are denoted with `(exec)`: ```none $ bazelisk config Available configurations: 0f80209fc7e3c0c40539... k8-opt-exec-ST-6f5a6fb95be7 (exec) 3a4b806bae496300ade4... k8-opt 790a1ad93f643dd7c565... k8-opt-exec-ST-d57f47055a04 (exec) 8472fe4754a50f76910e... k8-opt f37096aa0a6acd138bec... fastbuild-noconfig ``` # Bazel.html.md # Testing local changes with Bazel First [install Baselisk](https://bazel.build/install/bazelisk), then you’re ready for the main use-case of Bazel, which is to make modifications to OpenROAD and run fast local tests before creating a PR: ```none bazelisk test --jobs=4 src/... ``` - `...` means everything below this folder, so use `src/gpl/...` to run a smaller set of tests. - `--jobs=4` limits parallel builds to 4 cores, default is use all cores. For more comprehensive testing locally, includes longer OpenROAD integration tests and some ORFS smoke tests, install either [podman](https://podman.io/), which works without root permissions or Docker, then run: ```none bazelisk test ... ``` Note! You’ll see `bazel` in examples and documentation as well as `bazelisk`. The latter is a wafer thin layer on top of `bazel` that reads in the `.bazelversion` file to decide which version of Bazel to use in bazel. A word on expectations: Bazel is a valuable skill for the future. It is an example of a new generation of build tools(Buck2 is another example) that scales very well, are hermetic and have many features, such as artifacts. Unsurprisingly, this does mean that there is a lot to learn. The OpenROAD documentation makes no attempt at teaching Bazel. Bazel is a very wide topic and it can not be learned in a day or two with intense reading of a well defined document with a start and an end. It is probably best to start as a user running canned commands, such as above, but switch from mechanical repetition of canned command to being curious and following breadcrumbs of interest: read, search, engage with the community and use AI to learn. ## Running specific tests or tests below a folder To list all tests use bazelisk query with [Bazel query language](https://bazel.build/query/language): ```none bazelisk query 'kind(test, ...)' ``` List all tests below a folder containing `asap7`: ```none $ bazelisk query 'filter("asap7", kind(".*_test rule", //src/pdn/...))' //src/pdn/test:asap7_M1_M3_followpins-tcl ... ``` Run specific test: ```none baselisk test --test_output=errors //src/upf/test:levelshifter-tcl ``` To run or list tests below a folder: ```none bazelisk test src/gpl/... ``` ## Build configurations Bazel build configuration is a big topic as it covers cross compilation as well as multiplatform support. As a start, browse `.bazelrc` and also run: ```none $ bazelisk build [wait until it starts building then hist ctrl-c, this warms up the cache with information about available configs] $ bazelisk config Available configurations: 5e5e8a80a777eb91e67b2d19d33945262b2897b636da1007246cf68b6b6ec51d k8-fastbuild 781deb76199c2d7f1a6c7d54da3ea8dad03e6956c04db58addba49068e4d3797 k8-fastbuild 96deab75888eab9e42bcc5778aa824b18bb8ee745dfa1950a18536d75ee05e01 k8-opt-exec-ST-d57f47055a04 (exec) dd6f5325b352d3c63abe45b22d15914f75da7e2f140ace0017440dfc00f49114 k8-opt-exec-ST-d57f47055a04 (exec) f37096aa0a6acd138beca4ff4d66b677012cd1d0d54befaa35983993505dad60 fastbuild-noconfig f6ad5d5ec52c67510c6642c6d8df81fb134760a95c43d1f8e0369ad2c8964a81 k8-opt-exec-ST-6f5a6fb95be7 (exec) ``` Without offering any deeper insight some comments about what is shown above: - Each configuration has a textual shorthand used in folder names followed by a full hash - `fastbuild` is the default compromise between optimization and fast builds - `exec` means host, appears with `ST` and an extra hash at the end - `k8` always there, possibly referring to [K8](https://en.wikipedia.org/wiki/X86-64) ### LTO The default Bazel build (`fastbuild`) does not enable Link Time Optimization (LTO). `-c opt` enables optimization without LTO; `--config=opt` adds LTO on top, which improves runtime by ~11% at the cost of a much longer (single-threaded) link step. Use `--config=opt` for production binaries shipped to end users; keep the default for the local edit-rebuild loop. The CMake build has LTO on by default in Release mode – see the [CMake LTO option](Build.md#lto-options). ## Using OpenROAD as a dependency from another project OpenROAD can be consumed as a Bazel module (`bazel_dep`) from another project. The public API consists of two targets: | Target | Description | |---------------------------|-------------------------------| | `@openroad//:openroad` | The CLI binary | | `@openroad//:openroad_py` | Python bindings for scripting | All other targets (e.g. `openroad_lib`, internal libraries) are restricted to OpenROAD’s own subpackages and are not part of the public API. ### Minimal MODULE.bazel for a downstream project ```starlark module(name = "my-project") bazel_dep(name = "openroad") git_override( module_name = "openroad", commit = "", init_submodules = True, remote = "https://github.com/The-OpenROAD-Project/OpenROAD.git", ) # qt-bazel is not in BCR; git_override is root-module-only, # so downstream consumers must repeat it. bazel_dep(name = "qt-bazel") git_override( module_name = "qt-bazel", commit = "df022f4ebaa4130713692fffd2f519d49e9d0b97", remote = "https://github.com/The-OpenROAD-Project/qt_bazel_prebuilts", ) ``` ### Suggested: pin the C++ toolchain for reproducibility OpenROAD uses `toolchains_llvm` internally to lock the compiler version and ensure reproducible builds across developers and CI. Downstream consumers can use any C++20-capable compiler, but pinning the same toolchain is recommended to avoid compiler-specific issues: ```starlark bazel_dep(name = "toolchains_llvm", version = "1.5.0") llvm = use_extension("@toolchains_llvm//toolchain/extensions:llvm.bzl", "llvm") llvm.toolchain(llvm_version = "20.1.8") use_repo(llvm, "llvm_toolchain") register_toolchains("@llvm_toolchain//:all") ``` ### Dev dependencies not leaked to consumers The following are `dev_dependency` in OpenROAD and will not be forced on downstream projects via MVS: - rules_pkg — only needed for //:install - `rules_verilator`, `verilator` — only needed for test/orfs simulation - `toolchains_llvm` extension and toolchain registration The downstream test at `test/downstream/` verifies these invariants. ## Build without testing ```none bazelisk build :openroad ``` ## Version stamping By default, Bazel dev builds use a fixed placeholder version (`bazel-nostamp`) so that the build output is deterministic and fully cacheable across commits. To embed the real git version (e.g. `26Q1-1486-g6fe48208e4`), use `--config=release`: ```none bazelisk build --config=release :openroad ./bazel-bin/openroad -version ``` ## Platforms https://bazel.build/extending/platforms Note that this builds a different configuration than is used during tests. Tests run with the `cfg=exec` configuraiton, whereas the above builds the `cfg=target` configuration. The TL;DR is that you are probably better of running a single test to test building so that you don’t have to rebuild if you want to run tests after testing build. ## Can I force a rebuild? You should never have to in Bazel as builds are robust, trust the caching… That said: ```none bazelisk clean ``` Or more forcefully: ```none bazelisk clean --expunge ``` Or “nuke it from orbit”: ```none baselisk shutdown sudo pkill -9 java sudo rm -rf ~/.cache/bazel ``` ## Run tests with [address sanetizers](https://github.com/google/sanitizers/wiki/addresssanitizer): ```none bazelisk test --config=asan src/... ``` Example output: ```default [deleted] Direct leak of 18191 byte(s) in 2525 object(s) allocated from: #0 0x5f8556654e04 (/home/oyvind/.cache/bazel/_bazel_oyvind/896cc02f64446168f604c13ad7b60f8b/execroot/_main/bazel-out/k8-opt-exec-ST-d57f47055a04/bin/external/org_swig/swig+0x37de04) (BuildId: f982b51b51338154ba961612c62b330f) [deleted] SUMMARY: AddressSanitizer: 27236 byte(s) leaked in 3801 allocation(s). [deleted] ``` ## Testing an OpenROAD build with ORFS from within the OpenROAD folder ```none OPENROAD_EXE=$(pwd)/bazel-out/k8-opt-exec-ST-d57f47055a04/bin/openroad make --dir ~/OpenROAD-flow-scripts/flow/ DESIGN_CONFIG=designs/asap7/gcd/config.mk clean_floorplan floorplan ``` `$(pwd)/bazel-out/k8-opt-exec-ST-d57f47055a04/bin/openroad` points to the `cfg=exec` optimized configuration which is Bazel builds to run tests on host with e.g. `bazelisk test ...` ## Testing debug build of OpenROAD with ORFS Build OpenROAD in debug mode using a [workaround](https://github.com/The-OpenROAD-Project/OpenROAD/issues/7349): ```none bazelisk build --cxxopt=-stdlib=libstdc++ --linkopt=-lstdc++ -c dbg :openroad ``` Run ORFS flow and use debugger as usual for ORFS: ```none OPENROAD_EXE=$(pwd)/bazel-out/k8-dbg/bin/openroad make --dir ~/OpenROAD-flow-scripts/flow/ DESIGN_CONFIG=designs/asap7/gcd/config.mk clean_floorplan floorplan ``` ## Profiling OpenROAD with an ORFS build and your favorite profiling tool Build an optimized profile binary, using a [workaround](https://github.com/The-OpenROAD-Project/OpenROAD/issues/7349): ```none bazelisk build --config=profile --cxxopt=-stdlib=libstdc++ --linkopt=-lstdc++ :openroad ``` `bazel-bin` points to the results of the most recent `bazelisk build`. If you are switching between various builds, the more robust alternative is to point `OPENROAD_EXE` to the specific build configuration you want in `bazel-out`. Start an ORFS job that you want to profile: ```none OPENROAD_EXE=$(pwd)/bazel-bin/openroad make --dir ~/OpenROAD-flow-scripts/flow/ DESIGN_CONFIG=designs/asap7/gcd/config.mk clean_floorplan floorplan ``` At this point, use your favorite preformance tool, such as the Linx Perf tool: ```none perf top ``` Perhaps attach gdb and use ctrl-c from the command line? Use gdb with an IDE, emacs, or vim? ```none $ gdb bazel-bin/openroad [deleted] (gdb) attach 578603 Attaching to program: /home/oyvind/.cache/bazel/_bazel_oyvind/896cc02f64446168f604c13ad7b60f8b/execroot/_main/bazel-out/k8-fastbuild/bin/openroad, process 578603 #7 0x00005efc3b72b865 in isPolygonCorner () at src/drt/src/gc/FlexGC_init.cpp:705 705 poly_set.get(polygons); (gdb) list 700 bool isPolygonCorner(const frCoord x, 701 const frCoord y, 702 const gtl::polygon_90_set_data& poly_set) 703 { 704 std::vector> polygons; 705 poly_set.get(polygons); 706 for (const auto& polygon : polygons) { 707 for (const auto& pt : polygon) { 708 if (pt.x() == x && pt.y() == y) { 709 return true; ``` ## Creating an ORFS issue with bazel-orfs targets using `//:deps` Consider a failure in `//test/orfs/mock-array:MockArray_floorplan` as one can find if carefully searching the logs for `ERROR:` and looking for `target`: ```none $ bazelisk test //test/orfs/mock-array:MockArray_test [deleted] ERROR: /tmp/workspace/OpenROAD-Public_PR-7619-head/test/orfs/mock-array/BUILD:116:10: Action test/orfs/mock-array/results/asap7/MockArray/base/2_floorplan.odb failed: (Exit 2): bash failed: error executing Action command (from target //test/orfs/mock-array:MockArray_floorplan) /bin/bash -c ... (remaining 5 arguments skipped) [deleted] [ERROR MPL-0040] Failed on cluster root Error: macro_place.tcl, 5 MPL-0040 [deleted] //test/orfs/mock-array:MockArray_test FAILED TO BUILD ``` To create an ORFS `make issue`, follow these steps: ```none bazelisk run //:deps -- //test/orfs/mock-array:MockArray_floorplan ``` - In Bazel `//test/orfs/mock-array:MockArray_floorplan` failed and will leave behind no files, unless one uses `--sandbox_debug` - bazel-orfs provides a `//:deps` wrapper that builds only the `deps` output group (cheap config/template operations) and deploys the dependencies for running `make do-floorplan`. The same works for any stage: synth, place, cts, grt, route or final. - Files are placed in `tmp/test/orfs/mock-array/MockArray_floorplan_deps/` with a `make` script that is very nearly the same as `make DESIGN_CONFIG=...` with ORFS First run `do-floorplan` until the failure, notice that the `do-` prefix is used to disable the dependency checking in ORFS as bazel-orfs handles dependencies: ```none tmp/test/orfs/mock-array/MockArray_floorplan_deps/make do-floorplan ``` Now create an issue for e.g. `macro_place.tcl`: ```none tmp/test/orfs/mock-array/MockArray_floorplan_deps/make macro_place_issue ``` The generated file is placed into the `_main` subfolder: ```none tmp/test/orfs/mock-array/MockArray_floorplan_deps/_main/macro_place_MockArray_asap7_base_2025-06-19_21-50.tar.gz ``` ## Creating an ORFS issue with bazel-orfs targets using `--sandbox_debug` Hermeticity in Bazel requires some extra steps when debugging failures. If the action fails, then `--sandbox_debug` can be used. If the action succeeds or it is cached, `--sandbox_debug` does nothing. If you have a failure in `//test/orfs/mock-array:MockArray_floorplan`, look for `ERROR:` and looking for `target`, find the error: ```none $ bazelisk test //test/orfs/mock-array:MockArray_test [deleted] ERROR: /tmp/workspace/OpenROAD-Public_PR-7619-head/test/orfs/mock-array/BUILD:116:10: Action test/orfs/mock-array/results/asap7/MockArray/base/2_floorplan.odb failed: (Exit 2): bash failed: error executing Action command (from target //test/orfs/mock-array:MockArray_floorplan) /bin/bash -c ... (remaining 5 arguments skipped) [deleted] [ERROR MPL-0040] Failed on cluster root Error: macro_place.tcl, 5 MPL-0040 [deleted] //test/orfs/mock-array:MockArray_test FAILED TO BUILD ``` Use `--sandbox_debug` to keep the files around after failure: ```none bazelisk build //test/orfs/mock-array:MockArray_floorplan --sandbox_debug ``` Scan the log for setting up the shell and enviornment variables without linux-sandbox. ```none (cd /home/oyvind/.cache/bazel/_bazel_oyvind/896cc02f64446168f604c13ad7b60f8b/sandbox/linux-sandbox/8901/execroot/_main && \ exec env - \ DESIGN_CONFIG=bazel-out/k8-fastbuild/bin/test/orfs/mock-array/results/asap7/MockArray/base/2_floorplan.mk \ [deleted] /home/oyvind/.cache/bazel/_bazel_oyvind/install/772f324362dbeab9bc869b8fb3248094/linux-sandbox -t 15 -w /dev/shm -w /home/oyvind/.cache/bazel/_bazel_oyvind/ [deleted] /mock-array/reports/asap7/MockArray/base/2_floorplan_final.rpt && external/bazel-orfs++orfs_repositories+docker_orfs/usr/bin/make $@' '' --file external/bazel-orfs++orfs_repositories+docker_orfs/OpenROAD-flow-scripts/flow/Makefile do-floorplan) ``` Do a bit of suregery to remove the `linux-sandbox` and `exec env -` part, which can be a bit tempremental, to launch a bash shell. This leaves you with a) changing directory b) setting up environment variables c) launching bash shell: ```none (cd /home/oyvind/.cache/bazel/_bazel_oyvind/896cc02f64446168f604c13ad7b60f8b/sandbox/linux-sandbox/8901/execroot/_main && \ DESIGN_CONFIG=bazel-out/k8-fastbuild/bin/test/orfs/mock-array/results/asap7/MockArray/base/2_floorplan.mk \ [deleted] bash) ``` Now run `make issue` as usual: ```none $ make --file external/bazel-orfs++orfs_repositories+docker_orfs/OpenROAD-flow-scripts/flow/Makefile macro_place_issue Archiving issue to macro_place_MockArray_asap7_base_2025-06-20_12-57.tar.gz Using pigz to compress tar file ``` ## Some OpenROAD and OpenSTA Bazel Specifics Bazel distinguishes between *host* (`cfg=exec`) and *target* (`cfg=target`) configurations, a concept that becomes important when cross-compilation or tool usage is involved. In the OpenROAD Bazel build: - `bazelisk build ...` builds all targets in the **target configuration** (`cfg=target`), assuming you’re building for deployment or installation. - `bazelisk test ...`, on the other hand, uses OpenROAD and OpenSTA **as host tools**, meaning they are built and run in the **execution configuration** (`cfg=exec`), often to run tests or launch `bazel-orfs` builds. ### ⚠️ Avoiding Redundant Builds By default, `bazel test` would: 1. First build test dependencies in the **target** configuration. 2. Then build tools like OpenROAD/OpenSTA again in the **host** configuration to actually run the tests. This causes unnecessary duplication. To avoid this, `.bazelrc` includes the following to build only the tests: ```none test --build_tests_only ``` ## Using the OpenROAD project Bazel artifact server to download pre-built results A single read only artifact server is configured in `.bazelrc` OpenROAD hosted projects. This is a read only Bazel artifact server for anonymous access and is normally only updated by OpenROAD CI, though team OpenROAD team members can also update it directly. ## OpenROAD team member and CI - configuring write access to artifact server If you only have a single Google account that you use for Google Cloud locally, you can use `--google_default_credentials`. If you are use multiple google accounts, using the default credentials can be cumbersome when switching between projects. To avoid this, you can use the `--credential_helper` option instead, and pass a script that fetches credentials for the account you want to use. This account needs to have logged in using `gcloud auth login` and have access to the bucket specified. `.bazelrc` is under git version control and it will try to read in [user.bazelrc](https://bazel.build/configure/best-practices#bazelrc-file), which is not under git version control, which means that for git checkout or rebase operations will ignore the user configuration in `user.bazelrc`. Copy the snippet below into `user.bazelrc` and specify your username by modifying `# user: myname@openroad.tools`: ```none # user: myname@openroad.tools build --credential_helper=*.googleapis.com=%workspace%/etc/cred_helper.py ``` `cred_helper.py` will parse `user.bazelrc` and look for the username in the comment. To test, run: ```none $ ./cred_helper.py test Running: gcloud auth print-access-token oyvind@openroad.tools { "kind": "storage#testIamPermissionsResponse", "permissions": [ "storage.buckets.get", "storage.objects.create" ] } ``` > **Note:** To test the credential helper, make sure to restart Bazel to avoid using a previous > cached authorization: ```none bazel shutdown bazel build BoomTile_final_scripts ``` To gain write access to the https://storage.googleapis.com/megaboom-bazel-artifacts bucket, reach out to Tom Spyrou, Precision Innovations (https://www.linkedin.com/in/tomspyrou/). ## Bisecting OpenSTA or OpenROAD with Bazel Bisecting OpenROAD or OpenSTA requires finding a good and a bad commit. Normally in bisection, origin/master is bad, but finding a good commit is trickier because most commits are there solely to preserve review history and have not run through any extensive testing. Fortunately, OpenSTA is a submodule in OpenROAD that is tested before it is updated, so all the submodule commits in OpenROAD of OpenSTA are known to be of good quality. Similarly for OpenROAD and ORFS. A git/bash incantation will list the commit hashes of the src/sta submodule: ```none $ git log --pretty=format:'%h' -- src/sta | while read commit; do git show $commit src/sta| grep "Subproject commit" | awk '{print $3}'; done | head -n 10 5ee1a315141d1c799a0b2532e90ddccf52ddee95 3bff2d218c20adb867fcb3d8ae236f5da9928bed 3bff2d218c20adb867fcb3d8ae236f5da9928bed 5ee1a315141d1c799a0b2532e90ddccf52ddee95 f21d4a3878e2531e3af4930818d9b5968aad9416 3bff2d218c20adb867fcb3d8ae236f5da9928bed 522fc9563f25728f456bf86c2eb665c60d823e74 f21d4a3878e2531e3af4930818d9b5968aad9416 fa0cdd65290843e4e5cbe39d0bb9f2a63d580d1f 522fc9563f25728f456bf86c2eb665c60d823e74 ``` To build OpenSTA, use master of the https://github.com/The-OpenROAD-Project/OpenSTA fork, because it contains Bazel build files: ```none bazelisk build src/sta:opensta -c opt ``` Now start the bisection as usual with a bad and good commit from the above list: ```none $ cd src/sta $ git bisect start origin/master 6e95d93a44f7c46bb572933f5e2f8a624135820b HEAD is now at 6e95d93a Merge remote-tracking branch 'parallax/master' Bisecting: 55 revisions left to test after this (roughly 6 steps) [03d2a48f462105a39b5850b8f45d6c5db16fd5f0] misc ``` Use `git bisect --skip` if the version does not build or otherwise should not be tested. OpenSTA has an additional challenge in that only the https://github.com/The-OpenROAD-Project/OpenSTA fork has the Bazel BUILD file. To bisect the https://github.com/parallaxsw/OpenSTA branch, check out the branch you want, then check out BUILD from the fork and do a `git reset HEAD`. This will leave BUILD as a local file, because it is not in the upstream repository and bisection can be done on the upstream master branch. ## Testing the GUI with gcd on a pull request by number To test a PR with the GUI on gcd, run: ```default $ git fetch origin pull/7856/head $ git checkout FETCH_HEAD $ bazelisk run test/orfs/gcd:gcd_final gui_final ``` This will: - fetch and checkout pull request 7856 - build OpenROAD - run bazel-orfs flow on gcd - set up ORFS project in `tmp/test/orfs/gcd/gcd_final/` - launch the GUI opening gui_final gcd `bazelisk run test/orfs/gcd:gcd_final` run alone would set up the project. Additional arguments are forwarded to the `tmp/test/orfs/gcd/gcd_final/make` script. ## Hacking ORFS with `//test/orfs/gcd:gcd_test` test case First set up a local work folder with all dependencies for the step that you want to work on: ```none bazelisk run //:deps -- //test/orfs/gcd:gcd_floorplan ``` Now run make directly with the work folder, but be sure to use the `do-` targets that side-step ORFS make dependency checking: ```none make --file ~/OpenROAD-flow-scripts/flow/Makefile --dir tmp/test/orfs/gcd/gcd_floorplan_deps/_main DESIGN_CONFIG=config.mk do-floorplan ``` ## Whittling down .odb files Global place can take hours to run and to debug an error, the test case has to be whittled down to minutes, or it is probably intractable. Consider an error such as: ```none [ERROR GPL-0305] RePlAce diverged during gradient descent calculation, resulting in an invalid step length (Inf or NaN). This is often caused by numerical instability or high placement density. Consider reducing placement density to potentially resolve the issue. ``` First set up a folder with all the dependencies to run global placement: ```none bazelisk run //:deps -- //test/orfs/gcd:gcd_place ``` Drop into a shell that has the build environment set up: ```none $ tmp/test/orfs/gcd/gcd_place_deps/make bash Makefile Environment tmp/test/orfs/gcd/gcd_place_deps/_main ``` Run up to the failing stage and stop with ctrl-c on the step that you want to run the whittling down on: ```none make --file=$FLOW_HOME/Makefile do-place ``` Now run the whittler with stock `python3` — no extra packages needed beyond the standard library. You are responsible for having `openroad` on your `PATH` first (e.g. after `bazelisk run //:install` and `source env.sh` in an ORFS checkout): ```none python3 etc/whittle.py --error_string GPL-0305 --base_db_path 3_2_place_iop.odb --use_stdout --exit_early_on_error --step "make --file=$FLOW_HOME/Makefile do-3_3_place_gp" ``` This should eventually leave you with a whittled down .odb file. Copy the whittled down .odb file into the correct place for 3_2_place_iop.odb, then create a bug report: ```none tmp/test/orfs/gcd/gcd_place_deps/make global_place_issue ``` ### Monitoring progress whittle.py prints `[whittle]` status lines showing the current phase, element counts, .odb file size, and elapsed time. After a step runs for more than 5 minutes, whittle.py also shows the last 10 lines of the step’s log output so you can tell what the step is doing. If the .odb size is not shrinking after 20+ steps, try different parameters (`--persistence 1` for a coarser first pass, or a higher `--multiplier`). If each step takes more than 10 minutes, check that `--error_string` is specific enough (avoid generic strings like “ERROR”). ### Using Claude with whittle.py Point Claude at a GitHub issue that has an attached tarball artifact (from `make *_issue`). Claude can download the artifact, reproduce the bug with the latest OpenROAD, run whittle.py, and upload a smaller test case. | Scenario | Recommended flags | |-----------------------------|----------------------------------------------------------| | Global placement bugs | `--error_string GPL-XXXX --persistence 3 --multiplier 2` | | Fast initial reduction | `--persistence 1` first, then increase | | Large designs (>100K insts) | Start with `--timeout 600` | See the `/triage-issue` Claude skill in `.claude/skills/triage-issue/` for the full step-by-step workflow. # Build.html.md # Installing OpenROAD ## Clone Repository The first step, independent of the build method, is to download the repository: ```shell git clone --recursive https://github.com/The-OpenROAD-Project/OpenROAD.git cd OpenROAD ``` OpenROAD git submodules (cloned by the `--recursive` flag) are located in `src/`. #### NOTE There are three methods for building OpenROAD (in order of recommendation): prebuilt binaries, docker images, and finally, local build. ## Build and install with Bazel Build OpenROAD with GUI support and install into …/install/OpenROAD/bin ```none bazelisk run --//:platform=gui //:install ``` To install to a custom location, e.g. /tmp/myinstall ```none bazelisk run --//:platform=gui //:install -- /tmp/myinstall ``` To produce an openroad.tar file with install files ```none bazelisk build --//:platform=gui //:tarfile ``` The tarfile is located at bazel-bin/packaging/openroad.tar. To embed the real git version string, add `--config=release`: ```none bazelisk run --config=release --//:platform=gui //:install ``` The install process will install the binary “openroad” and the runfile directory “openroad.runfiles” which contains runtime data needed by the binary. See [Bazel](Bazel.md) for more details on testing, profiling and build configurations. ## Build with Prebuilt Binaries Courtesy of [Precision Innovations](https://precisioninno.com/), there are prebuilt binaries of OpenROAD with self-contained dependencies released on a regular basis. Refer to this [link](https://openroad-flow-scripts.readthedocs.io/en/latest/user/BuildWithPrebuilt.html) for instructions. ## Build with Docker ### Prerequisites - For this method you only need to install [Docker](https://docs.docker.com/engine/install) on your machine. - Ensure that you have sufficient memory allocated to the Virtual Machine (VM) as per our system [requirements](../index.md#system-requirements). Refer to this [Docker guide](https://docs.docker.com/config/containers/resource_constraints/) for setting CPU cores and memory limits. ### Installation We recommend to use a Docker image of a supported OS and install OpenROAD using the prebuilt binaries from Precision Innovations. You can start the container in an interactive mode using the command below. ```shell docker run -it ubuntu:22.04 ``` Now you are ready to install the prebuilt binaries. Please refer to the instructions for installing prebuilt binaries [above](). ## Build Locally The default build type is `RELEASE` to compile optimized code. The resulting executable is in `build/bin/openroad`. Optional CMake variables passed as `-D=` arguments to CMake are show below. | Argument | Value | |------------------------|---------------------------| | `CMAKE_BUILD_TYPE` | DEBUG, RELEASE | | `CMAKE_CXX_FLAGS` | Additional compiler flags | | `TCL_LIBRARY` | Path to Tcl library | | `TCL_HEADER` | Path to `tcl.h` | | `ZLIB_ROOT` | Path to `zlib` | | `CMAKE_INSTALL_PREFIX` | Path to install binary | #### NOTE There is a `openroad_build.log` file that is generated with every build in the build directory. In case of filing issues, it can be uploaded in the “Relevant log output” section of OpenROAD [issue forms](https://github.com/The-OpenROAD-Project/OpenROAD-flow-scripts/issues/new/choose). ### Only for macOS Setup On macOS, it is recommended to use a Python virtual environment to isolate dependencies and avoid system conflicts. 1. Create a virtual environment in the OpenROAD directory: ```shell python3 -m venv .venv ``` 1. Activate the virtual environment: ```shell source .venv/bin/activate ``` 1. With virtual environment activated, run without `sudo`: ```shell ./etc/DependencyInstaller.sh -base ./etc/DependencyInstaller.sh -common -local ``` ### Install Dependencies We recommend using the `setup.sh` script located in the [OpenROAD-flow-scripts](https://github.com/The-OpenROAD-Project/OpenROAD-flow-scripts) repository to install all dependencies. `setup.sh` encapsulates the calls to `DependencyInstaller.sh` and ensures the entire flow environment is configured correctly. Alternatively, if you are building OpenROAD standalone, you may use our helper script: ```shell sudo ./etc/DependencyInstaller.sh -base ./etc/DependencyInstaller.sh -common -local ``` #### WARNING `sudo ./etc/DependencyInstaller.sh [-all|-common]` defaults to installing packages on /usr/local. To avoid this bahavior use -local flag or -prefix argument. ### Build OpenROAD To build with the default options in release mode: ```shell ./etc/Build.sh ``` #### Custom Library Path To build with debug option enabled and if the Tcl library is not on the default path. ```shell ./etc/Build.sh -cmake="-DCMAKE_BUILD_TYPE=DEBUG -DTCL_LIB=/path/to/tcl/lib" ``` #### Enable `manpages` To build the `manpages`: ```shell ./etc/Build.sh -build-man ``` #### LTO Options By default, OpenROAD is built with link time optimizations enabled. This adds about 1 minute to compile times and improves the runtime by about 11%. If you would like to disable LTO pass `-DLINK_TIME_OPTIMIZATION=OFF` when generating a build. #### Build with Address Sanitizer To enable building with Address Sanitizer, use the argument `-DASAN=ON`. Setting the `ASAN` variable to `ON` adds necessary compile and link options for using Address Sanitizer. #### NOTE Address Sanitizer adds instrumentation for detecting memory errors. Enabling this option will cause OpenROAD to run slower and consume more RAM. #### System wide OpenROAD Install #### WARNING Only use the following instructions if you know what you are doing. ```shell sudo make install ``` The default install directory is `/usr/local`. To install in a different directory with CMake use: ```shell ./etc/Build.sh -cmake="-DCMAKE_INSTALL_PREFIX=" ``` Alternatively, you can use the `DESTDIR` variable with make. ```shell make -C build DESTDIR= install ``` # CI.html.md # CI Guide This document describes the pipelines available to the developers and code maintainers in the [Jenkins server](https://jenkins.openroad.tools/). Note that pipelines with the suffix `*-Private` are only available to code maintainers and The OpenROAD Project members as they can contain confidential information. Thus, to access Private pipelines one needs to have authorization to access confidential data and be logged in the Jenkins website. Below there is a list of the available features. Instructions on how to navigate Jenkins to access these features are available [here](https://docs.google.com/presentation/d/1kWHLjUBFcd0stnDaPNi_pt9WFrrsR7tQ95BGhT1yOvw/edit?usp=sharing). - Find your build through Jenkins website or from GitHub. - See test status: Pass/Fail. - Log files for each test. - Build artifacts to reproduce failures. - HTML reports about code coverage and metrics. ## OpenROAD App - OpenROAD-Coverage-Public - Description: run dynamic code coverage tool `lconv`. - Target: master branch. - Report link [here](https://jenkins.openroad.tools/job/OpenROAD-Coverage-Public/Dynamic_20Code_20Coverage/). - OpenROAD-Coverity-Public - Description: compile and submit builds to Coverity static code analysis tool. - Target: master branch. - Report link [here](https://scan.coverity.com/projects/the-openroad-project-openroad). - OpenROAD-Nightly-Public - Description: `openroad` unit tests, docker builds, ISPD 2018 and 2019 benchmarks for DRT and large unit tests of GPL. - Target: master branch. - OpenROAD-Public - Description: `openroad` unit tests and docker builds. - Target: all branches and open PRs. - OpenROAD-Special-Private - Description: for developer testing, runs ISPD 2018 and 2019 benchmarks for DRT and large unit tests of GPL. - Target branches: `TR_*`, `secure-TR_*`, `TR-*`, `secure-TR-*`. - OpenROAD-Private - Description: `openroad` unit tests and docker builds. - Target: all branches. Note that PRs will be run on public side after “Ready to Sync Public” workflow. ## OpenROAD Flow - Information about OpenROAD Flow CI jobs can be found [here](https://openroad-flow-scripts.readthedocs.io/en/latest/contrib/CI.html) ## OpenLane - OpenLane-MPW-CI-Public - Description: test projects to older MPW shuttles with newer OpenLane versions. - [Repo link](https://github.com/The-OpenROAD-Project/OpenLane-MPW-CI). - OpenLane-Public - Description: test OpenLane with latest commit from OpenROAD. - [Repo link](https://github.com/The-OpenROAD-Project/OpenLane). # CLAUDE.html.md # OpenROAD - AI agent context This file provides project-specific guidance for AI agent sessions working on the OpenROAD codebase. ## Quick Reference Detailed guides are in `docs/agents/` subdirectory: - **Build Pitfalls**: See `docs/agents/build.md` - **Testing Guide**: See `docs/agents/testing.md` - **Git & CI**: See `docs/agents/ci.md` - **Coding Patterns**: See `docs/agents/coding.md` ## Critical Rules 1. **Ask before modifying `src/sta/` files** – OpenSTA is managed upstream (`Sdc.cc`, `Power.cc`, `Sdc.tcl`, etc.). Prefer fixes in OpenROAD code (e.g., src/dbSta/, src/rsz/) when possible. 2. Run `clang-format -i ` for C++ files before commit. **NEVER** for `src/sta/*` and `*.i` files. 3. **Always use `git commit -s`** for DCO compliance. 4. When amending submodule commits, parent repo submodule reference must also be updated via `git submodule update --init --recursive`. It is needed after any merge/pull. 5. **Trace bugs upstream** – when a bug appears in output (e.g., Verilog), find the data creation point (e.g., `buffer_ports`, `remove_buffers`), not the serialization point (e.g., `VerilogWriter`). ## AI Agent Skills Skills are located in `.agents/skills/` (with `.claude/skills` symlink for Claude Code). | Skill | Purpose | Invocation | |----------------|------------------------------------------------------------------------|------------------------------------| | `triage-issue` | Reproduce bug and minimize test case with whittle.py | `/triage-issue ` | | `fix-bug` | Trace root cause, implement fix, create tests, prepare commit | `/fix-bug ` | | `add-test` | Add integration/unit tests with dual CMake+Bazel registration | `/add-test [description]` | | `review-pr` | Draft local PR review notes (correctness > QoR > testing); human posts | `/review-pr ` | # CODE_OF_CONDUCT.html.md # Contributor Covenant Code of Conduct ## Our Pledge We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community. ## Our Standards Examples of behavior that contributes to a positive environment for our community include: * Demonstrating empathy and kindness toward other people * Being respectful of differing opinions, viewpoints, and experiences * Giving and gracefully accepting constructive feedback * Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience * Focusing on what is best not just for us as individuals, but for the overall community Examples of unacceptable behavior include: * The use of sexualized language or imagery, and sexual attention or advances of any kind * Trolling, insulting or derogatory comments, and personal or political attacks * Public or private harassment * Publishing others’ private information, such as a physical or email address, without their explicit permission * Other conduct which could reasonably be considered inappropriate in a professional setting ## Enforcement Responsibilities Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate. ## Scope This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at complaints@openroad.tools. All complaints will be reviewed and investigated promptly and fairly. All community leaders are obligated to respect the privacy and security of the reporter of any incident. ## Enforcement Guidelines Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct: ### 1. Correction **Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. **Consequence**: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested. ### 2. Warning **Community Impact**: A violation through a single incident or series of actions. **Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban. ### 3. Temporary Ban **Community Impact**: A serious violation of community standards, including sustained inappropriate behavior. **Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban. ### 4. Permanent Ban **Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. **Consequence**: A permanent ban from any sort of public interaction within the community. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org), version 2.0, available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. Community Impact Guidelines were inspired by [Mozilla’s code of conduct enforcement ladder](https://github.com/mozilla/inclusion). For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations. # CONTRIBUTING.html.md # Contributing to OpenROAD Thank you for contributing to OpenROAD. For setup, coding standards, and workflow details, see the existing guides: - Getting Involved – how to contribute, licensing, DCO - Developer Guide – architecture, tool structure, testing - Coding Practices – C++ style and idioms - Logger Guide – logging API for C++ and Tcl ## Review Priorities Reviews are prioritized in this order: ### 1. Correctness The most important concern. Code must produce correct results. - Flag any code that could silently produce wrong output. An explicit error is always preferable to silently incorrect behavior. - Watch for classic bugs: iterator invalidation, use-after-free, off-by-one, integer overflow in area calculations (use `int64_t` for area), deleting from a container while iterating over it. - Code after `error()` or `throw` is unreachable – remove it. - If a test is being disabled or suppressed, ask whether it is hiding a real bug. ### 2. Quality of Results (QoR) Impact Any change that could affect placement, routing, timing, or other physical design metrics must be validated. - Ask: “Does this have a QoR impact?” Changes affecting QoR require validation on real designs, not just unit tests. Maintainers will trigger the necessary CI runs for this. - Be skeptical of QoR improvements claimed from a single design. Improvements should be validated across multiple designs and technologies. ### 3. Testing Every code change should have accompanying tests. See the Developer Guide for test conventions. ### 4. Architecture and Dependencies OpenROAD is a single-process, single-database tool. See the Developer Guide for architectural guidelines and the tool checklist. ### 5. C++ Style and Logging We follow the [Google C++ style guide](https://google.github.io/styleguide/cppguide.html). See Coding Practices for project-specific idioms and the Logger Guide for the logging API. ### 6. Process - Every commit must include a DCO sign-off (`git commit -s`). - CI must be green before review. Reviewers may not look at failing PRs. - Keep PRs focused on one bug or feature. Style fixes go in separate commits. - Reference an open issue for non-trivial changes. - Mac builds are best-effort and not merge-blocking. ## For AI/LLM Code Reviewers When reviewing OpenROAD pull requests, follow the priority order above. Focus review comments on correctness and QoR impact rather than style nitpicks – `clang-tidy` and `clang-format` handle style automatically. Specific guidance: - **Be concise.** One-word or one-sentence comments are preferred when the issue is clear (e.g., “const”, “unreachable after throw”). - **Ask probing questions** rather than prescribing fixes for non-obvious issues (e.g., “Have you tested this on a real design?” or “Could this hide a bug?”). - **Flag QoR-affecting changes** that lack validation on real designs. - **Don’t generate summaries** of the PR unless asked. The config disables automatic summaries. - **Do flag** unreachable code after `error()`/`throw`, missing `const`, null pointer issues, iterator invalidation, and missing tests. - **Don’t flag** style issues already covered by `clang-format` or `clang-tidy`. - **Check database schema changes** – any change to the ODB schema requires a revision bump to prevent old versions from misinterpreting new data. - **Watch for memory concerns** – `dbITerm` and similar objects are numerous. Adding fields to heavily-instantiated classes has real memory cost. ## License Contributions should use the BSD-3-Clause license. See [LICENSE](LICENSE). # CodingPractices.html.md # Coding Practices List of coding practices. #### NOTE This is a compilation of many idioms in OpenROAD code that are considered undesirable. ## C++ ### Practice #1 Don’t comment out code, instead remove it. `git` provides a complete history of the code if you want to look backwards. Huge chunks of commented-out code make it difficult to read. ### Practice #2 Don’t use prefixes on function names or variables. That’s what namespaces are for. ```cpp namespace fr { class frConstraint class frLef58CutClassConstraint class frShortConstraint class frNonSufficientMetalConstraint class frOffGridConstraint class frMinEnclosedAreaConstraint class frMinStepConstraint class frMinimumcutConstraint class frAreaConstraint class frMinWidthConstraint class frLef58SpacingEndOfLineWithinEndToEndConstraint class frLef58SpacingEndOfLineWithinParallelEdgeConstraint class frLef58SpacingEndOfLineWithinMaxMinLengthConstraint class frLef58SpacingEndOfLineWithinConstraint class frLef58SpacingEndOfLineConstraint } ``` ### Practice #3 Namespaces should be all lower case and short. This is an example of a poor choice: `namespace TritonCTS` ### Practice #4 Don’t use `extern` on function definitions. It is pointless in a world with prototypes. ```cpp namespace fr { extern frCoord getGCELLGRIDX(); extern frCoord getGCELLGRIDY(); extern frCoord getGCELLOFFSETX(); extern frCoord getGCELLOFFSETY(); } ``` ### Practice #5 Don’t use prefixes on file names. That’s what directories are for. ```shell frDRC.h frDRC_init.cpp frDRC_main.cpp frDRC_setup.cpp frDRC_util.cpp ``` ### Practice #6 Don’t name variables `theThingy`, `curThingy` or `myThingy`. It is just distracting extraneous verbiage. Just use `thingy`. ```cpp float currXSize; float currYSize; float currArea; float currWS; float currWL; float currWLnoWts; ``` ### Practice #7 Do not use global variables. All state should be inside of classes. Global variables make multi-threading next to impossible and preclude having multiple copies of a tool running in the same process. The only global variable in `openroad` should be the singleton that Tcl commands reference. ```cpp extern std::string DEF_FILE; extern std::string GUIDE_FILE; extern std::string OUTGUIDE_FILE; extern std::string LEF_FILE; extern std::string OUTTA_FILE; extern std::string OUT_FILE; extern std::string DBPROCESSNODE; extern std::string OUT_MAZE_FILE; extern std::string DRC_RPT_FILE; extern int MAX_THREADS ; extern int VERBOSE ; extern int BOTTOM_ROUTING_LAYER; extern bool ALLOW_PIN_AS_FEEDTHROUGH; extern bool USENONPREFTRACKS; extern bool USEMINSPACING_OBS; extern bool RESERVE_VIA_ACCESS; extern bool ENABLE_BOUNDARY_MAR_FIX; ``` ### Practice #8 Do not use strings (names) to refer to database or sta objects except in user interface code. DEF, SDC, and Verilog all use different names for netlist instances and nets, so the names will not always match. ### Practice #9 Do not use continue. Wrap the body in an if instead. ```cpp // instead of for(dbInst* inst : block->getInsts() ) { // Skip for standard cells if (inst->getBBox()->getDY() <= cellHeight) { continue; } // code } // use for(dbInst* inst : block->getInsts() ){ // Skip for standard cells if (inst->getBBox()->getDY() > cellHeight) { // code } } ``` ### Practice #10 Don’t put magic numbers in the code. Use a variable with a name that captures the intent. Document the units if they exist. ```cpp referenceHpwl_= 446000000; coeffV = 1.36; coeffV = 1.2; double nearest_dist = 99999999999; if (dist < rowHeight * 2) {} for(int i = 9; i > -1; i--) {} if(design_util > 0.6 || num_fixed_nodes > 0) div = 1; avail_region_area += (theRect->xUR - theRect->xLL - (int)theRect->xUR % 200 + (int)t heRect->xLL % 200 - 200) * (theRect->yUR - theRect->yLL - (int)theRect->yUR % 2000 + (int)theRect->yLL % 2000 - 2000); ``` ### Practice #11 Don’t copy code fragments. Write functions. ```cpp // 10x int x_pos = (int)floor(theCell->x_coord / wsite + 0.5); // 15x int y_pos = (int)floor(y_coord / rowHeight + 0.5); // This nets[newnetID]->netIDorg = netID; nets[newnetID]->numPins = numPins; nets[newnetID]->deg = pinInd; nets[newnetID]->pinX = (short *)malloc(pinInd* sizeof(short)); nets[newnetID]->pinY = (short *)malloc(pinInd* sizeof(short)); nets[newnetID]->pinL = (short *)malloc(pinInd* sizeof(short)); nets[newnetID]->alpha = alpha; // Should factor out the array lookup. Net *net = nets[newnetID]; net->netIDorg = netID; net->numPins = numPins; net->deg = pinInd; net->pinX = (short*)malloc(pinInd* sizeof(short)); net->pinY = (short *)malloc(pinInd* sizeof(short)); net->pinL = (short *)malloc(pinInd* sizeof(short)); net->alpha = alpha; // Same here: if (grid[j][k].group != UINT_MAX) { if (grid[j][k].isValid) { if (groups[grid[j][k].group].name == theGroup->name) area += wsite * rowHeight; } } ``` ### Practice #12 Don’t use logical operators to test for null pointers. ```cpp if (!net) { // code } // should be if (net != nullptr) { // code } ``` ### Practice #13 Don’t use `malloc`. Use `new`. We are writing C++, not C. ### Practice #14 Don’t use C style arrays. There is no bounds checks for them so they invite subtle memory errors to unwitting programmers who fail to use `valgrind`. Use `std::vector` or `std::array`. ### Practice #15 Break long functions into smaller ones, preferably that fit on one screen. ### Practice #16 Don’t reinvent functions like `round`, `floor`, `abs`, `min`, `max`. Use the std versions. ```cpp int size_x = (int)floor(theCell->width / wsite + 0.5); ``` ### Practice #17 Don’t use C’s stdlib.h `abs`, `fabs` or `fabsf`. They fail miserably if the wrong arg type is passed to them. Use `std::abs`. ### Practice #18 Fold code common to multiple loops into the same loop. Each of these functions loops over every instance like this: ```cpp legal &= row_check(log); legal &= site_check(log); for(int i = 0; i < cells.size(); i++) { cell* theCell = &cells[i]; legal &= power_line_check(log); legal &= edge_check(log); legal &= placed_check(log); legal &= overlap_check(log); } // with this loop for(int i = 0; i < cells.size(); i++) { cell* theCell = &cells[i]; } ``` Instead make one pass over the instances doing each check. ### Practice #19 Don’t use `== true`, or `== false`. Boolean expressions already have a value of true or false. ```cpp if(found.first == true) { // code } // is simply if(found.first) { // code } // and if(found.first == false) { // code } // is simply if(!found.first) { // code } ``` ### Practice #20 Don’t nest if statements. Use `&&` on the clauses instead. ```cpp if(grid[j][k].group != UINT_MAX) if(grid[j][k].isValid == true) if(groups[grid[j][k].group].name == theGroup->name) ``` is simply ```cpp if(grid[j][k].group != UINT_MAX && grid[j][k].isValid && groups[grid[j][k].group].name == theGroup->name) ``` ### Practice #21 Don’t call return at the end of a function that does not return a value. ### Practice #22 Don’t use `<>` to include anything but system headers. Your project’s headers should never be in `<>`. 1. [GCC Include Syntax](https://gcc.gnu.org/onlinedocs/cpp/Include-Syntax.html) 2. [StackOverflow discussion on “filename” vs ](https://stackoverflow.com/questions/21593/what-is-the-difference-between-include-filename-and-include-filename) These are all wrong: ```cpp #include #include #include #include #include #include #include ``` ### Practice #23 Don’t make “include the kitchen sink” headers and include them in every source file. This is convenient but slows the builds down for everyone. Make each source file include just the headers it actually needs. ```cpp // Types.hpp #include #include #include // It should be obvious that every source file is not reading def. #include // or writing it. #include #include #include "db_sta/dbNetwork.hh" #include "db_sta/dbSta.hh" ``` Note this example also incorrectly uses `<>'s` around OpenROAD headers. Header files should only include files to support the header. Include files necessary for code in the code file, not the header. In the example below NONE of the system files listed are necessary for the header file. ```cpp #include #include #include #include unsigned num_nets = 1000; unsigned num_terminals = 64; unsigned verbose = 0; float alpha1 = 1; float alpha2 = 0.45; float alpha3 = 0; float alpha4 = 0; float margin = 1.1; unsigned seed = 0; unsigned root_idx = 0; unsigned dist = 2; float beta = 1.4; bool runOneNet = false; unsigned net_num = 0; ``` ### Practice #24 Use class declarations if you are only referring to objects by pointer instead of including their complete class definition. This can vastly reduce the code the compiler has to process. ```cpp class Network; // instead of #include "Network.hh" ``` ### Practice #25 Use pragma once instead of `#define` to protect headers from being read more than once. The #define symbol has to be unique, which is difficult to guarantee. ```cpp // Instead of: #ifndef __MACRO_PLACER_HASH_UTIL__ #define __MACRO_PLACER_HASH_UTIL__ #endif // use #pragma once ``` ### Practice #26 Don’t put `using namespace` inside a function. ### Practice #27 Don’t nest namespaces. ### Practice #28 Avoid `using namespace`. It increases the likelihood of conflicts and doesn’t explicity declare what in the namespace is being used. Use `using namespace::symbol;` instead. And especially do not use `using namespace std`. The following is especially confused because it is trying to “use” the symbols in code that are already in the MacroPlace namespace. ```cpp using namespace MacroPlace; namespace MacroPlace { } ``` ### Practice #29 Use `nullptr` instead of `NULL`. This is the C++ approved version of the ancient C `#define`. ### Practice #30 Use range iteration. C++ iterators are ugly and verbose. ```cpp // Instead of odb::dbSet::iterator nIter; for (nIter = nets.begin(); nIter != nets.end(); ++nIter) { odb::dbNet* currNet = *nIter; // code } // use for (odb::dbNet* currNet : nets) { // code } ``` ### Practice #31 Don’t use end of line comments unless they are very short. ```cpp for (int x = firstTile._x; x <= lastTile._x; x++) { // Setting capacities of edges completely inside the adjust region according the percentage of reduction // code } ``` ### Practice #32 Don’t `std::pow` for powers of 2 or for decimal constants. ```cpp // This double newCapPerSqr = (_options->getCapPerSqr() * std::pow(10.0, -12)); // Should be double newCapPerSqr = _options->getCapPerSqr() * 1E-12; // This unsigned numberOfTopologies = std::pow(2, numberOfNodes); // Should be unsigned numberOfTopologies = 1 << numberOfNodes; ``` ## Git ### Practice #33 Don’t put /’s in `.gitignore` directory names. `test/` ### Practice #34 Don’t put file names in `.gitignore` ignored directories. `test/results` `test/results/diffs` ### Practice #35 Don’t list compile artifacts in `.gitignore`. They all end up in the build directory so each file type does not have to appear in `.gitignore`. All of the following are to be avoided: #### Compiled Object files `*.slo *.lo *.o *.obj` #### Precompiled Headers `*.gch *.pch` #### Compiled Dynamic libraries `*.so *.dylib *.dll` #### Fortran module files `*.mod *.smod` #### Compiled Static libraries `*.lai *.la *.a *.lib` ## CMake ### Practice #36 Don’t change compile flags in `cmake` files. These are set at the top level and should not be overridden. ```cmake set(CMAKE_CXX_FLAGS "-O3") set(CMAKE_CXX_FLAGS_DEBUG "-g -ggdb") set(CMAKE_CXX_FLAGS_RELEASE "-O3") ``` ### Practice #37 Don’t put /’s in CMake directory names. CMake knows they are directories. ```cmake target_include_directories( ABKCommon PUBLIC ${ABKCOMMON_HOME} src/ ) ``` ### Practice #38 Don’t use `glob`. Explicitly list the files in a group. ```cmake # Instead of file(GLOB_RECURSE SRC_FILES ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp) # should be list(REMOVE_ITEM SRC_FILES ${CMAKE_CURRENT_SOURCE_DIR}/src/Main.cpp) list(REMOVE_ITEM SRC_FILES ${CMAKE_CURRENT_SOURCE_DIR}/src/Parameters.h) list(REMOVE_ITEM SRC_FILES ${CMAKE_CURRENT_SOURCE_DIR}/src/Parameters.cpp) ``` # DEF_Grammar.html.md # DEF Grammar Railroad Diagrams The DEF (Design Exchange Format) grammar defines the syntax for the design description files read and written by OpenROAD’s ODB module. The grammar is implemented as a Bison parser in [`src/odb/src/def/def/def.y`](../src/def/def/def.y). Railroad diagrams (also called syntax diagrams) give an at-a-glance visual summary of each grammar rule. The SVGs below are generated directly from `def.y` by [`generate_railroad_diagrams.py`](generate_railroad_diagrams.py) and are regenerated automatically via CI whenever `def.y` changes. ## Contents - [File structure]() - [Design Attributes]() - [Properties]() - [Components]() - [Nets]() - [Net Routing]() - [Net Subnets]() - [Special Nets]() - [Pins]() - [Virtual Pins]() - [Pin Properties]() - [Blockages]() - [Regions]() - [Groups]() - [Via Definitions]() - [Non-default Rules]() - [Fills]() - [Slots]() - [Styles]() - [IO Timing]() - [Scan Chains]() - [Timing Disables]() - [Partitions]() - [Constraints]() - [Assertions]() - [Floorplan Constraints]() - [Extension]() - [Primitives]() ## File structure ### `def_file` ![def_file](main/src/odb/doc/images/def/def_file.svg) ### `rule` ![rule](main/src/odb/doc/images/def/rule.svg) ### `version_stmt` ![version_stmt](main/src/odb/doc/images/def/version_stmt.svg) ### `case_sens_stmt` ![case_sens_stmt](main/src/odb/doc/images/def/case_sens_stmt.svg) ### `end_design` ![end_design](main/src/odb/doc/images/def/end_design.svg) ### `design_name` ![design_name](main/src/odb/doc/images/def/design_name.svg) ### `tech_name` ![tech_name](main/src/odb/doc/images/def/tech_name.svg) ### `history` ![history](main/src/odb/doc/images/def/history.svg) ### `bus_bit_chars` ![bus_bit_chars](main/src/odb/doc/images/def/bus_bit_chars.svg) ### `divider_char` ![divider_char](main/src/odb/doc/images/def/divider_char.svg) ### `array_name` ![array_name](main/src/odb/doc/images/def/array_name.svg) ### `floorplan_name` ![floorplan_name](main/src/odb/doc/images/def/floorplan_name.svg) ## Design Attributes ### `design_section` ![design_section](main/src/odb/doc/images/def/design_section.svg) ### `die_area` ![die_area](main/src/odb/doc/images/def/die_area.svg) ### `units` ![units](main/src/odb/doc/images/def/units.svg) ### `gcellgrid` ![gcellgrid](main/src/odb/doc/images/def/gcellgrid.svg) ### `tracks_rule` ![tracks_rule](main/src/odb/doc/images/def/tracks_rule.svg) ### `track_start` ![track_start](main/src/odb/doc/images/def/track_start.svg) ### `track_opts` ![track_opts](main/src/odb/doc/images/def/track_opts.svg) ### `track_type` ![track_type](main/src/odb/doc/images/def/track_type.svg) ### `track_layer` ![track_layer](main/src/odb/doc/images/def/track_layer.svg) ### `track_layer_statement` ![track_layer_statement](main/src/odb/doc/images/def/track_layer_statement.svg) ### `track_mask_statement` ![track_mask_statement](main/src/odb/doc/images/def/track_mask_statement.svg) ### `row_rule` ![row_rule](main/src/odb/doc/images/def/row_rule.svg) ### `row_option` ![row_option](main/src/odb/doc/images/def/row_option.svg) ### `row_step_option` ![row_step_option](main/src/odb/doc/images/def/row_step_option.svg) ### `row_do_option` ![row_do_option](main/src/odb/doc/images/def/row_do_option.svg) ### `row_prop` ![row_prop](main/src/odb/doc/images/def/row_prop.svg) ### `row_or_comp` ![row_or_comp](main/src/odb/doc/images/def/row_or_comp.svg) ## Properties ### `prop_def_section` ![prop_def_section](main/src/odb/doc/images/def/prop_def_section.svg) ### `property_def` ![property_def](main/src/odb/doc/images/def/property_def.svg) ### `property_type_and_val` ![property_type_and_val](main/src/odb/doc/images/def/property_type_and_val.svg) ## Components ### `comps_section` ![comps_section](main/src/odb/doc/images/def/comps_section.svg) ### `comps_maskShift_section` ![comps_maskShift_section](main/src/odb/doc/images/def/comps_maskShift_section.svg) ### `start_comps` ![start_comps](main/src/odb/doc/images/def/start_comps.svg) ### `end_comps` ![end_comps](main/src/odb/doc/images/def/end_comps.svg) ### `comp` ![comp](main/src/odb/doc/images/def/comp.svg) ### `comp_start` ![comp_start](main/src/odb/doc/images/def/comp_start.svg) ### `comp_id_and_name` ![comp_id_and_name](main/src/odb/doc/images/def/comp_id_and_name.svg) ### `comp_name` ![comp_name](main/src/odb/doc/images/def/comp_name.svg) ### `comp_option` ![comp_option](main/src/odb/doc/images/def/comp_option.svg) ### `comp_type` ![comp_type](main/src/odb/doc/images/def/comp_type.svg) ### `comp_source` ![comp_source](main/src/odb/doc/images/def/comp_source.svg) ### `comp_eeq` ![comp_eeq](main/src/odb/doc/images/def/comp_eeq.svg) ### `comp_foreign` ![comp_foreign](main/src/odb/doc/images/def/comp_foreign.svg) ### `comp_generate` ![comp_generate](main/src/odb/doc/images/def/comp_generate.svg) ### `comp_halo` ![comp_halo](main/src/odb/doc/images/def/comp_halo.svg) ### `comp_routehalo` ![comp_routehalo](main/src/odb/doc/images/def/comp_routehalo.svg) ### `comp_region` ![comp_region](main/src/odb/doc/images/def/comp_region.svg) ### `comp_region_start` ![comp_region_start](main/src/odb/doc/images/def/comp_region_start.svg) ### `comp_extension_stmt` ![comp_extension_stmt](main/src/odb/doc/images/def/comp_extension_stmt.svg) ### `comp_prop` ![comp_prop](main/src/odb/doc/images/def/comp_prop.svg) ### `comp_property` ![comp_property](main/src/odb/doc/images/def/comp_property.svg) ### `comp_blockage_rule` ![comp_blockage_rule](main/src/odb/doc/images/def/comp_blockage_rule.svg) ### `placement_comp_rule` ![placement_comp_rule](main/src/odb/doc/images/def/placement_comp_rule.svg) ### `placement_status` ![placement_status](main/src/odb/doc/images/def/placement_status.svg) ### `halo_soft` ![halo_soft](main/src/odb/doc/images/def/halo_soft.svg) ## Nets ### `nets_section` ![nets_section](main/src/odb/doc/images/def/nets_section.svg) ### `start_nets` ![start_nets](main/src/odb/doc/images/def/start_nets.svg) ### `end_nets` ![end_nets](main/src/odb/doc/images/def/end_nets.svg) ### `one_net` ![one_net](main/src/odb/doc/images/def/one_net.svg) ### `net_and_connections` ![net_and_connections](main/src/odb/doc/images/def/net_and_connections.svg) ### `net_start` ![net_start](main/src/odb/doc/images/def/net_start.svg) ### `net_name` ![net_name](main/src/odb/doc/images/def/net_name.svg) ### `net_connection` ![net_connection](main/src/odb/doc/images/def/net_connection.svg) ### `net_option` ![net_option](main/src/odb/doc/images/def/net_option.svg) ### `net_type` ![net_type](main/src/odb/doc/images/def/net_type.svg) ### `net_prop` ![net_prop](main/src/odb/doc/images/def/net_prop.svg) ### `netsource_type` ![netsource_type](main/src/odb/doc/images/def/netsource_type.svg) ### `conn_opt` ![conn_opt](main/src/odb/doc/images/def/conn_opt.svg) ### `use_type` ![use_type](main/src/odb/doc/images/def/use_type.svg) ### `source_type` ![source_type](main/src/odb/doc/images/def/source_type.svg) ## Net Routing ### `paths` ![paths](main/src/odb/doc/images/def/paths.svg) ### `path` ![path](main/src/odb/doc/images/def/path.svg) ### `new_path` ![new_path](main/src/odb/doc/images/def/new_path.svg) ### `path_item` ![path_item](main/src/odb/doc/images/def/path_item.svg) ### `path_item_list` ![path_item_list](main/src/odb/doc/images/def/path_item_list.svg) ### `path_pt` ![path_pt](main/src/odb/doc/images/def/path_pt.svg) ### `opt_taper` ![opt_taper](main/src/odb/doc/images/def/opt_taper.svg) ### `opt_taper_style` ![opt_taper_style](main/src/odb/doc/images/def/opt_taper_style.svg) ### `opt_shape_style` ![opt_shape_style](main/src/odb/doc/images/def/opt_shape_style.svg) ### `opt_style` ![opt_style](main/src/odb/doc/images/def/opt_style.svg) ### `opt_pattern` ![opt_pattern](main/src/odb/doc/images/def/opt_pattern.svg) ### `weight` ![weight](main/src/odb/doc/images/def/weight.svg) ### `width` ![width](main/src/odb/doc/images/def/width.svg) ### `shield_layer` ![shield_layer](main/src/odb/doc/images/def/shield_layer.svg) ## Net Subnets ### `subnet_option` ![subnet_option](main/src/odb/doc/images/def/subnet_option.svg) ### `subnet_type` ![subnet_type](main/src/odb/doc/images/def/subnet_type.svg) ### `subnet_opt_syn` ![subnet_opt_syn](main/src/odb/doc/images/def/subnet_opt_syn.svg) ### `opt_common_pins` ![opt_common_pins](main/src/odb/doc/images/def/opt_common_pins.svg) ### `floating_pins` ![floating_pins](main/src/odb/doc/images/def/floating_pins.svg) ### `ordered_pins` ![ordered_pins](main/src/odb/doc/images/def/ordered_pins.svg) ### `one_floating_inst` ![one_floating_inst](main/src/odb/doc/images/def/one_floating_inst.svg) ### `one_ordered_inst` ![one_ordered_inst](main/src/odb/doc/images/def/one_ordered_inst.svg) ### `opt_pin` ![opt_pin](main/src/odb/doc/images/def/opt_pin.svg) ## Special Nets ### `snets_section` ![snets_section](main/src/odb/doc/images/def/snets_section.svg) ### `start_snets` ![start_snets](main/src/odb/doc/images/def/start_snets.svg) ### `end_snets` ![end_snets](main/src/odb/doc/images/def/end_snets.svg) ### `snet_rule` ![snet_rule](main/src/odb/doc/images/def/snet_rule.svg) ### `snet_option` ![snet_option](main/src/odb/doc/images/def/snet_option.svg) ### `snet_other_option` ![snet_other_option](main/src/odb/doc/images/def/snet_other_option.svg) ### `snet_spacing` ![snet_spacing](main/src/odb/doc/images/def/snet_spacing.svg) ### `snet_voltage` ![snet_voltage](main/src/odb/doc/images/def/snet_voltage.svg) ### `snet_width` ![snet_width](main/src/odb/doc/images/def/snet_width.svg) ### `snet_prop` ![snet_prop](main/src/odb/doc/images/def/snet_prop.svg) ### `spaths` ![spaths](main/src/odb/doc/images/def/spaths.svg) ### `spath` ![spath](main/src/odb/doc/images/def/spath.svg) ### `snew_path` ![snew_path](main/src/odb/doc/images/def/snew_path.svg) ### `geom_fill` ![geom_fill](main/src/odb/doc/images/def/geom_fill.svg) ### `geom_slot` ![geom_slot](main/src/odb/doc/images/def/geom_slot.svg) ## Pins ### `pin_rule` ![pin_rule](main/src/odb/doc/images/def/pin_rule.svg) ### `start_pins` ![start_pins](main/src/odb/doc/images/def/start_pins.svg) ### `end_pins` ![end_pins](main/src/odb/doc/images/def/end_pins.svg) ### `pin_cap_rule` ![pin_cap_rule](main/src/odb/doc/images/def/pin_cap_rule.svg) ### `pin_cap` ![pin_cap](main/src/odb/doc/images/def/pin_cap.svg) ### `pin` ![pin](main/src/odb/doc/images/def/pin.svg) ### `pin_option` ![pin_option](main/src/odb/doc/images/def/pin_option.svg) ### `pin_layer_opt` ![pin_layer_opt](main/src/odb/doc/images/def/pin_layer_opt.svg) ### `pin_layer_mask_opt` ![pin_layer_mask_opt](main/src/odb/doc/images/def/pin_layer_mask_opt.svg) ### `pin_layer_spacing_opt` ![pin_layer_spacing_opt](main/src/odb/doc/images/def/pin_layer_spacing_opt.svg) ### `pin_via_mask_opt` ![pin_via_mask_opt](main/src/odb/doc/images/def/pin_via_mask_opt.svg) ### `pin_poly_mask_opt` ![pin_poly_mask_opt](main/src/odb/doc/images/def/pin_poly_mask_opt.svg) ### `pin_poly_spacing_opt` ![pin_poly_spacing_opt](main/src/odb/doc/images/def/pin_poly_spacing_opt.svg) ### `pin_oxide` ![pin_oxide](main/src/odb/doc/images/def/pin_oxide.svg) ## Virtual Pins ### `vpin_stmt` ![vpin_stmt](main/src/odb/doc/images/def/vpin_stmt.svg) ### `vpin_begin` ![vpin_begin](main/src/odb/doc/images/def/vpin_begin.svg) ### `vpin_layer_opt` ![vpin_layer_opt](main/src/odb/doc/images/def/vpin_layer_opt.svg) ### `vpin_options` ![vpin_options](main/src/odb/doc/images/def/vpin_options.svg) ### `vpin_status` ![vpin_status](main/src/odb/doc/images/def/vpin_status.svg) ## Pin Properties ### `pin_props_section` ![pin_props_section](main/src/odb/doc/images/def/pin_props_section.svg) ### `begin_pin_props` ![begin_pin_props](main/src/odb/doc/images/def/begin_pin_props.svg) ### `end_pin_props` ![end_pin_props](main/src/odb/doc/images/def/end_pin_props.svg) ### `pin_prop_terminal` ![pin_prop_terminal](main/src/odb/doc/images/def/pin_prop_terminal.svg) ### `pin_prop` ![pin_prop](main/src/odb/doc/images/def/pin_prop.svg) ### `pin_prop_name_value` ![pin_prop_name_value](main/src/odb/doc/images/def/pin_prop_name_value.svg) ## Blockages ### `blockage_section` ![blockage_section](main/src/odb/doc/images/def/blockage_section.svg) ### `blockage_start` ![blockage_start](main/src/odb/doc/images/def/blockage_start.svg) ### `blockage_end` ![blockage_end](main/src/odb/doc/images/def/blockage_end.svg) ### `blockage_def` ![blockage_def](main/src/odb/doc/images/def/blockage_def.svg) ### `blockage_rule` ![blockage_rule](main/src/odb/doc/images/def/blockage_rule.svg) ### `layer_blockage_rule` ![layer_blockage_rule](main/src/odb/doc/images/def/layer_blockage_rule.svg) ### `mask_blockage_rule` ![mask_blockage_rule](main/src/odb/doc/images/def/mask_blockage_rule.svg) ### `comp_blockage_rule` ![comp_blockage_rule](main/src/odb/doc/images/def/comp_blockage_rule.svg) ### `rectPoly_blockage` ![rectPoly_blockage](main/src/odb/doc/images/def/rectPoly_blockage.svg) ### `rect_statement` ![rect_statement](main/src/odb/doc/images/def/rect_statement.svg) ### `rect_pts` ![rect_pts](main/src/odb/doc/images/def/rect_pts.svg) ## Regions ### `regions_section` ![regions_section](main/src/odb/doc/images/def/regions_section.svg) ### `regions_start` ![regions_start](main/src/odb/doc/images/def/regions_start.svg) ### `regions_stmt` ![regions_stmt](main/src/odb/doc/images/def/regions_stmt.svg) ### `region_option` ![region_option](main/src/odb/doc/images/def/region_option.svg) ### `region_type` ![region_type](main/src/odb/doc/images/def/region_type.svg) ### `region_prop` ![region_prop](main/src/odb/doc/images/def/region_prop.svg) ## Groups ### `groups_section` ![groups_section](main/src/odb/doc/images/def/groups_section.svg) ### `groups_start` ![groups_start](main/src/odb/doc/images/def/groups_start.svg) ### `groups_end` ![groups_end](main/src/odb/doc/images/def/groups_end.svg) ### `start_group` ![start_group](main/src/odb/doc/images/def/start_group.svg) ### `group_rule` ![group_rule](main/src/odb/doc/images/def/group_rule.svg) ### `group_member` ![group_member](main/src/odb/doc/images/def/group_member.svg) ### `group_option` ![group_option](main/src/odb/doc/images/def/group_option.svg) ### `group_region` ![group_region](main/src/odb/doc/images/def/group_region.svg) ### `group_soft_option` ![group_soft_option](main/src/odb/doc/images/def/group_soft_option.svg) ### `group_prop` ![group_prop](main/src/odb/doc/images/def/group_prop.svg) ## Via Definitions ### `via_section` ![via_section](main/src/odb/doc/images/def/via_section.svg) ### `start_def_cap` ![start_def_cap](main/src/odb/doc/images/def/start_def_cap.svg) ### `end_def_cap` ![end_def_cap](main/src/odb/doc/images/def/end_def_cap.svg) ### `via` ![via](main/src/odb/doc/images/def/via.svg) ### `via_declaration` ![via_declaration](main/src/odb/doc/images/def/via_declaration.svg) ### `via_end` ![via_end](main/src/odb/doc/images/def/via_end.svg) ### `layer_stmt` ![layer_stmt](main/src/odb/doc/images/def/layer_stmt.svg) ### `layer_viarule_opts` ![layer_viarule_opts](main/src/odb/doc/images/def/layer_viarule_opts.svg) ## Non-default Rules ### `nondefaultrule_section` ![nondefaultrule_section](main/src/odb/doc/images/def/nondefaultrule_section.svg) ### `nondefault_start` ![nondefault_start](main/src/odb/doc/images/def/nondefault_start.svg) ### `nondefault_end` ![nondefault_end](main/src/odb/doc/images/def/nondefault_end.svg) ### `nondefault_def` ![nondefault_def](main/src/odb/doc/images/def/nondefault_def.svg) ### `nondefault_option` ![nondefault_option](main/src/odb/doc/images/def/nondefault_option.svg) ### `nondefault_layer_option` ![nondefault_layer_option](main/src/odb/doc/images/def/nondefault_layer_option.svg) ### `nondefault_prop` ![nondefault_prop](main/src/odb/doc/images/def/nondefault_prop.svg) ### `nondefault_prop_opt` ![nondefault_prop_opt](main/src/odb/doc/images/def/nondefault_prop_opt.svg) ## Fills ### `fill_section` ![fill_section](main/src/odb/doc/images/def/fill_section.svg) ### `fill_start` ![fill_start](main/src/odb/doc/images/def/fill_start.svg) ### `fill_end` ![fill_end](main/src/odb/doc/images/def/fill_end.svg) ### `fill_rule` ![fill_rule](main/src/odb/doc/images/def/fill_rule.svg) ### `fill_def` ![fill_def](main/src/odb/doc/images/def/fill_def.svg) ### `fill_layer_opc` ![fill_layer_opc](main/src/odb/doc/images/def/fill_layer_opc.svg) ### `fill_mask` ![fill_mask](main/src/odb/doc/images/def/fill_mask.svg) ### `fill_viaMask` ![fill_viaMask](main/src/odb/doc/images/def/fill_viaMask.svg) ### `fill_via_opc` ![fill_via_opc](main/src/odb/doc/images/def/fill_via_opc.svg) ### `fill_via_pt` ![fill_via_pt](main/src/odb/doc/images/def/fill_via_pt.svg) ## Slots ### `slot_section` ![slot_section](main/src/odb/doc/images/def/slot_section.svg) ### `slot_start` ![slot_start](main/src/odb/doc/images/def/slot_start.svg) ### `slot_end` ![slot_end](main/src/odb/doc/images/def/slot_end.svg) ### `slot_rule` ![slot_rule](main/src/odb/doc/images/def/slot_rule.svg) ### `slot_def` ![slot_def](main/src/odb/doc/images/def/slot_def.svg) ## Styles ### `styles_section` ![styles_section](main/src/odb/doc/images/def/styles_section.svg) ### `styles_start` ![styles_start](main/src/odb/doc/images/def/styles_start.svg) ### `styles_end` ![styles_end](main/src/odb/doc/images/def/styles_end.svg) ### `styles_rule` ![styles_rule](main/src/odb/doc/images/def/styles_rule.svg) ## IO Timing ### `iotiming_section` ![iotiming_section](main/src/odb/doc/images/def/iotiming_section.svg) ### `start_iotiming` ![start_iotiming](main/src/odb/doc/images/def/start_iotiming.svg) ### `iotiming_end` ![iotiming_end](main/src/odb/doc/images/def/iotiming_end.svg) ### `iotiming_rule` ![iotiming_rule](main/src/odb/doc/images/def/iotiming_rule.svg) ### `iotiming_member` ![iotiming_member](main/src/odb/doc/images/def/iotiming_member.svg) ### `iotiming_frompin` ![iotiming_frompin](main/src/odb/doc/images/def/iotiming_frompin.svg) ### `iotiming_parallel` ![iotiming_parallel](main/src/odb/doc/images/def/iotiming_parallel.svg) ### `iotiming_drivecell_opt` ![iotiming_drivecell_opt](main/src/odb/doc/images/def/iotiming_drivecell_opt.svg) ## Scan Chains ### `scanchains_section` ![scanchains_section](main/src/odb/doc/images/def/scanchains_section.svg) ### `scanchain_start` ![scanchain_start](main/src/odb/doc/images/def/scanchain_start.svg) ### `scanchain_end` ![scanchain_end](main/src/odb/doc/images/def/scanchain_end.svg) ### `scan_rule` ![scan_rule](main/src/odb/doc/images/def/scan_rule.svg) ### `scan_member` ![scan_member](main/src/odb/doc/images/def/scan_member.svg) ### `td_macro_option` ![td_macro_option](main/src/odb/doc/images/def/td_macro_option.svg) ## Timing Disables ### `timingdisables_section` ![timingdisables_section](main/src/odb/doc/images/def/timingdisables_section.svg) ### `timingdisables_start` ![timingdisables_start](main/src/odb/doc/images/def/timingdisables_start.svg) ### `timingdisables_end` ![timingdisables_end](main/src/odb/doc/images/def/timingdisables_end.svg) ### `timingdisables_rule` ![timingdisables_rule](main/src/odb/doc/images/def/timingdisables_rule.svg) ### `turnoff` ![turnoff](main/src/odb/doc/images/def/turnoff.svg) ### `turnoff_hold` ![turnoff_hold](main/src/odb/doc/images/def/turnoff_hold.svg) ### `turnoff_setup` ![turnoff_setup](main/src/odb/doc/images/def/turnoff_setup.svg) ### `wiredlogic_rule` ![wiredlogic_rule](main/src/odb/doc/images/def/wiredlogic_rule.svg) ## Partitions ### `partitions_section` ![partitions_section](main/src/odb/doc/images/def/partitions_section.svg) ### `partitions_start` ![partitions_start](main/src/odb/doc/images/def/partitions_start.svg) ### `partitions_end` ![partitions_end](main/src/odb/doc/images/def/partitions_end.svg) ### `start_partition` ![start_partition](main/src/odb/doc/images/def/start_partition.svg) ### `partition_rule` ![partition_rule](main/src/odb/doc/images/def/partition_rule.svg) ### `partition_member` ![partition_member](main/src/odb/doc/images/def/partition_member.svg) ### `partition_maxbits` ![partition_maxbits](main/src/odb/doc/images/def/partition_maxbits.svg) ### `min_or_max_member` ![min_or_max_member](main/src/odb/doc/images/def/min_or_max_member.svg) ### `minmaxpins` ![minmaxpins](main/src/odb/doc/images/def/minmaxpins.svg) ## Constraints ### `constraint_section` ![constraint_section](main/src/odb/doc/images/def/constraint_section.svg) ### `constraints_start` ![constraints_start](main/src/odb/doc/images/def/constraints_start.svg) ### `constraints_end` ![constraints_end](main/src/odb/doc/images/def/constraints_end.svg) ### `constraint_rules` ![constraint_rules](main/src/odb/doc/images/def/constraint_rules.svg) ### `constraint_rule` ![constraint_rule](main/src/odb/doc/images/def/constraint_rule.svg) ### `constraint_type` ![constraint_type](main/src/odb/doc/images/def/constraint_type.svg) ### `constrain_what` ![constrain_what](main/src/odb/doc/images/def/constrain_what.svg) ### `operand` ![operand](main/src/odb/doc/images/def/operand.svg) ### `operand_rule` ![operand_rule](main/src/odb/doc/images/def/operand_rule.svg) ### `delay_spec` ![delay_spec](main/src/odb/doc/images/def/delay_spec.svg) ### `risefall` ![risefall](main/src/odb/doc/images/def/risefall.svg) ### `risefallminmax1` ![risefallminmax1](main/src/odb/doc/images/def/risefallminmax1.svg) ### `risefallminmax2` ![risefallminmax2](main/src/odb/doc/images/def/risefallminmax2.svg) ## Assertions ### `assertions_section` ![assertions_section](main/src/odb/doc/images/def/assertions_section.svg) ### `assertions_start` ![assertions_start](main/src/odb/doc/images/def/assertions_start.svg) ### `assertions_end` ![assertions_end](main/src/odb/doc/images/def/assertions_end.svg) ## Floorplan Constraints ### `floorplan_contraints_section` ![floorplan_contraints_section](main/src/odb/doc/images/def/floorplan_contraints_section.svg) ### `fp_start` ![fp_start](main/src/odb/doc/images/def/fp_start.svg) ### `fp_stmt` ![fp_stmt](main/src/odb/doc/images/def/fp_stmt.svg) ### `canplace` ![canplace](main/src/odb/doc/images/def/canplace.svg) ### `cannotoccupy` ![cannotoccupy](main/src/odb/doc/images/def/cannotoccupy.svg) ## Extension ### `extension_section` ![extension_section](main/src/odb/doc/images/def/extension_section.svg) ### `extension_stmt` ![extension_stmt](main/src/odb/doc/images/def/extension_stmt.svg) ## Primitives ### `pt` ![pt](main/src/odb/doc/images/def/pt.svg) ### `firstPt` ![firstPt](main/src/odb/doc/images/def/firstPt.svg) ### `nextPt` ![nextPt](main/src/odb/doc/images/def/nextPt.svg) ### `otherPts` ![otherPts](main/src/odb/doc/images/def/otherPts.svg) ### `orient` ![orient](main/src/odb/doc/images/def/orient.svg) ### `orient_pt` ![orient_pt](main/src/odb/doc/images/def/orient_pt.svg) ### `virtual_pt` ![virtual_pt](main/src/odb/doc/images/def/virtual_pt.svg) ### `virtual_statement` ![virtual_statement](main/src/odb/doc/images/def/virtual_statement.svg) ### `opt_plus` ![opt_plus](main/src/odb/doc/images/def/opt_plus.svg) ### `opt_semi` ![opt_semi](main/src/odb/doc/images/def/opt_semi.svg) ### `opt_paren` ![opt_paren](main/src/odb/doc/images/def/opt_paren.svg) ### `opt_num_val` ![opt_num_val](main/src/odb/doc/images/def/opt_num_val.svg) ### `opt_range` ![opt_range](main/src/odb/doc/images/def/opt_range.svg) ### `opt_snet_range` ![opt_snet_range](main/src/odb/doc/images/def/opt_snet_range.svg) ### `h_or_v` ![h_or_v](main/src/odb/doc/images/def/h_or_v.svg) ### `same_mask` ![same_mask](main/src/odb/doc/images/def/same_mask.svg) ### `mask` ![mask](main/src/odb/doc/images/def/mask.svg) ### `maskLayer` ![maskLayer](main/src/odb/doc/images/def/maskLayer.svg) ### `maskShift` ![maskShift](main/src/odb/doc/images/def/maskShift.svg) ### `opt_mask_opc` ![opt_mask_opc](main/src/odb/doc/images/def/opt_mask_opc.svg) ### `opt_mask_opc_l` ![opt_mask_opc_l](main/src/odb/doc/images/def/opt_mask_opc_l.svg) ### `pattern_type` ![pattern_type](main/src/odb/doc/images/def/pattern_type.svg) ### `shape_type` ![shape_type](main/src/odb/doc/images/def/shape_type.svg) ## Regenerating the diagrams After editing `def.y`, re-run: ```shell python3 src/odb/doc/generate_railroad_diagrams.py def ``` Java 11 or later must be on `PATH`. The WAR tools are vendored in `src/odb/doc/tools/` and are not downloaded at runtime. # DatabaseMath.html.md # Database Math 101 ## Introduction DEF defines the units it uses with the `UNITS` command. ```default UNITS DISTANCE MICRONS 1000 ; ``` Typically the units are 1000 or 2000 database units (DBU) per micron. DBUs are integers, so the distance resolution is typically 0.001 um or 1nm. OpenDB uses an `int` to represent a DBU, which on most hardware is 4 bytes. This means a database coordinate can be $\pm 2147483647$, which is about $2 \cdot 10^9$ units, corresponding to $2 \cdot 10^6$ or $2$ meters. ## Datatype Choice This section is important as we cover important math considerations for your datatype choice when dealing with large numbers. ### Why not pure int? Since chip coordinates cannot be negative, it would make sense to use an `unsigned int` to represent a distance. This conveys the fact that it can never be negative and doubles the maximum possible distance that can be represented. The problem, however, is that doing subtraction with unsigned numbers is dangerous because the differences can be negative. An unsigned negative number looks like a very very big number. So this is a very bad idea and leads to bugs. Note that calculating an area with `int` values is problematic. An `int * int` does not fit in an `int`. **Our suggestion is to use `int64_t` in this situation.** Although `long` “works”, its size is implementation-dependent. ### Why not double? It has been noticed that some programs use `double` to calculate distances. This can be problematic, as `double` have a mantissa of 52 bits, which means that the largest possible integer value that can be represented without loss is $5\cdot 10^{15}$. This is 12 bits less than the largest possible integer value that can be represented by an `int64_t`. As a result, if you are doing an area calculation on a large chip that is more than $\sqrt{5\cdot 10^{15}} = 7\cdot 10^7\ DBU$ on a side, the mantissa of the double will overflow and the result will be truncated. Not only is a `double` less capable than an `int64_t`, but using it tells any reader of the code that the value can be a real number, such as $104.23$. So it is extremely misleading. ### Use int only for LEF/DEF Distances Circling back to LEF, we see that unlike DEF the distances are real numbers like 1.3 even though LEF also has a distance unit statement. We suspect this is a historical artifact of a mistake made in the early definition of the LEF file format. The reason it is a mistake is because decimal fractions cannot be represented exactly in binary floating-point. For example, $1.1 = 1.00011001100110011...$, a continued fraction. OpenDB uses `int` to represent LEF distances, just as with DEF. This solves the problem by multiplying distances by a decimal constant (distance units) to convert the distance to an integer. In the future I would like to see OpenDB use a `dbu` typedef instead of `int` everywhere. ### Why not float? We have also noticed RePlAce, OpenDP, TritonMacroPlace and OpenNPDN all using `double` or `float` to represent distances. This can be problematic, as floating-point numbers cannot always represent exact fractions. As a result, these tools need to `round` or `floor` the results of their calculations, which can introduce errors. Additionally, some of these tools reinvent the wheel by implementing their own rounding functions, as we shall see in the example below. This can lead to inconsistencies and is highly discouraged. ```cpp (int) x_coord + 0.5 ``` Worse than using a `double` is using a `float`, because the mantissa is only 23 bits, so the maximum exactly representable integer is $8\cdot 10^6$. This makes it even less capable than an `int`. When a value has to be snapped to a grid such as the pitch of a layer, the calculation can be done with a simple divide using `int`, which `floor` the result. For example, to snap a coordinate to the pitch of a layer the following can be used: ```cpp int x, y; inst->getOrigin(x, y); int pitch = layer->getPitch(); int x_snap = (x / pitch) * pitch; ``` The use of rounding in existing code that uses floating-point representations is to compensate for the inability to represent floating-point fractions exactly. Results like $5.99999999992$ need to be “fixed”. This problem does not exist if fixed-point arithmetic is used. # DeveloperGuide.html.md # Developer Guide ## Tool Philosophy OpenROAD is a tool to build a chip from synthesizable RTL (Verilog) to completed physical layout (manufacturable, tapeout-clean GDSII). The unifying principle behind the design of OpenROAD is for all of the tools to reside in one tool, with one process, and one database. All tools in the flow should use Tcl commands exclusively to control them instead of external “configuration files”. File-based communication between tools and forking processes is strongly discouraged. This architecture streamlines the construction of a flexible tool flow and minimizes the overhead of invoking each tool in the flow. ## Tool File Organization Every tool follows the following file structure, grouping sources, tests and headers together. - `src/` This folder contains the source files for individual tools. | `src` | Purpose | |---------------------------|----------------------------------| | `CMakeLists.txt` | `add_subdirectory` for each tool | | `tool/src` | sources and private headers | | `tool/src/CMakeLists.txt` | tool specific CMake file | | `tool/include/tool` | exported headers | | `tool/test` | tool tests | | `tool/regression` | tool unit tests | - OpenROAD repository: This folder contains the top-level files for overall compilation. OpenROAD uses [swig](https://swig.org/) that acts as a wrapper for C/C++ programs to be callable in higher-level languages, such as Python and Tcl. | `OpenROAD` | Purpose | |---------------------------|--------------------------------------------------| | `CMakeLists.txt` | top-level CMake file | | `src/Main.cc` | main file | | `src/OpenROAD.cc` | OpenROAD class functions | | `src/OpenROAD.i` | top-level swig, includes, tool swig files | | `src/OpenROAD.tcl` | basic read/write lef/def/db commands | | `include/ord/OpenROAD.hh` | OpenROAD top-level class, has instances of tools | Some tools such as OpenSTA are submodules, which are simply subdirectories in `src/` that are pointers to the git submodule. They are intentionally not segregated into a separate module. The use of submodules for new code integrated into OpenROAD is strongly discouraged. Submodules make changes to the underlying infrastructure (e.g., OpenSTA) difficult to propagate across the dependent submodule repositories. Where external/third-party code that a tool depends on should be placed depends on the nature of the dependency. - Libraries - code packaged as a linkable library. Examples are `tcl`, `boost`, `zlib`, `eigen`, `lemon`, `spdlog`. These should be installed in the build environment and linked by OpenROAD. Document these dependencies in the top-level `README.md` file. The `Dockerfile` should be updated to illustrate where to find the library and how to install it. Adding libraries to the build environment requires coordination with system administrators, so that continuous integration hosts ensure that environments include the dependency. Advance notification should also be given to the development team so that their private build environments can be updated. Each tool CMake file builds a library that is linked by the OpenROAD application. The tools should not define a `main()` function. If the tool is Tcl only and has no C++ code, it does not need to have a CMake file. Tool CMake files should **not** include the following: - `cmake_minimum_required` - `GCC_COVERAGE_COMPILE_FLAGS` - `GCC_COVERAGE_LINK_FLAGS` - `CMAKE_CXX_FLAGS` - `CMAKE_EXE_LINKER_FLAGS` None of the tools have commands to read or write LEF, DEF, Verilog or database files. For consistency, these functions are all provided by the OpenROAD framework. Tools should package all of their state in a single class. An instance of each tool class resides in the top-level OpenROAD object. This allows multiple tools to exist at the same time. If any tool keeps state in global variables (even static), then only one tool can exist at a time. Many of the tools being integrated were not built with this goal in mind and will only work on one design at a time. Each tool should use a unique namespace for all of its code. The same namespace should be used for Tcl functions, including those defined by a swig interface file. Internal Tcl commands stay inside the namespace, and user visible Tcl commands should be defined in the global namespace. User commands should be simple Tcl commands such as `global_placement` that do not create tool instances that must be based to the commands. Defining Tcl commands for a tool class is fine for internal commands, but not for user visible commands. Commands have an implicit argument of the current OpenROAD class object. Functions to get individual tools from the OpenROAD object can be defined. ## Initialization (C++ tools only) The OpenROAD class has pointers to each tool, with functions to get each tool. Each tool has (at a minimum) a function to make an instance of the tool class, an initialization function that is called after all of the tools have been made, and a function to delete the tool. This small header does **not** include the class definition for the tool so that the OpenROAD framework does not have to know anything about the tool internals or include a gigantic header file. `MakeTool.hh` defines the following: ```cpp Tool *makeTool(); void initTool(OpenRoad *openroad); void deleteTool(Tool *tool); ``` The `OpenRoad::init()` function calls all of the `makeTool` functions and then all of the `initTool()` functions. The `init` functions are called from the bottom of the tool dependencies. Each `init` function grabs the state it needs out of the `OpenRoad` instance. ## Commands Tools should provide Tcl commands to control them. Tcl object based tool interfaces are not user-friendly. Define Tcl procedures that take keyword arguments that reference the `OpenRoad` object to get tool state. OpenSTA has Tcl utilities to parse keyword arguments (`sta::parse_keyword_args`). See `OpenSTA/tcl/*.tcl` for examples. Use swig to define internal functions to C++ functionality. Tcl files can be included by encoding them in CMake into a string that is evaluated at run time (See [`Resizer::init()`](../main/src/rsz/src/Resizer.cc)). #### NOTE Please refer to the top-level Tcl formatting [guide](TclFormat.md). Our top-level Tcl files, in particular, have to be formatted in this specific manner because of the automatic parsing used to convert the READMEs into manpages. ## Errors Tools should report errors to the user using the logging infrastructure described in the [Logger guide](Logger.md). The `utl::error` function throws an exception that is caught at the Tcl command level. The variables `exit_on_error` and `file_continue_on_error` control how the error is handled. If `exit_on_error` is `1` then OpenROAD reports the error and exits. If the error is encountered while reading a file with the `source` or `read_sdc` commands and `file_continue_on_error` is `0` then no other commands are read from the file. ## Test Each “tool” has a `/test` directory containing a script named `regression` to run “unit” tests. With no arguments it should run default unit tests. No database files should be in tests. Read LEF/DEF/Verilog to make a database. The regression script should not depend on the current working directory. It should be able to be run from any directory. Use filenames relative to the script name rather the current working directory. Regression scripts should print a concise summary of test failures. The regression script should return an exit code of 0 if there are no errors and 1 if there are errors. The script should **not** print thousands of lines of internal tool information. Regression scripts should pass the `-no_init` option to `openroad` so that a user’s `init` file is not sourced before the tests runs. Regression scripts should add output files or directories to `.gitignore` so that running does not leave the source repository “dirty”. The Nangate45 open-source library data used by many tests is in `test/Nangate45`. Use the following command to add a link in the tool command: ```shell cd src//test ln -s ../../../test/Nangate45 ``` After the link is installed, the test script can read the Liberty file with the command shown below. ```tcl read_liberty Nangate45/Nangate45_typ.lib ``` ## Building Instructions for building are available [here](../user/Build.md). ## Example of Adding a Tool to OpenROAD The directory [src/exa](../main/src/exa/README.md) illustrates a tool named “Example” that uses the file structure described above. It defines a command to run the tool as illustrated below: ```tcl > example_instance -name test [INFO EXA-0001] Making an example instance named test > help example_instance example_instance [-name name] ``` The example include TCL & Python APIs with unit tests. Also demonstrated is how to create debug graphics for algorithm visualization. Running `openroad -gui basic.tcl` in `src/exa/test` will demonstrate the capability. ## Documentation Tool commands should be documented in the top-level OpenROAD `README.md` file. Detailed documentation should be the `tool/README.md` file. #### NOTE Please refer to the README formatting [guide](ReadmeFormat.md). Our top-level READMEs, in particular, have to be formatted in this specific manner because of the automatic parsing used to convert the READMEs into manpages. ## Tool Flow Namespace Tool namespaces are usually three-lettered lowercase letters. - Verilog to DB (dbSTA) - OpenDB: Open Database ([odb](../main/src/odb/README.md)) - TritonPart: constraints-driven paritioner ([par](../main/src/par/README.md)) - Floorplan Initialization ([ifp](../main/src/ifp/README.md)) - ICeWall chip-level connections ([pad](../main/src/pad/README.md)) - I/O Placement ([ppl](../main/src/ppl/README.md)) - PDN Generation ([pdn](../main/src/pdn/README.md)) - Tapcell and Welltie Insertion ([tap](../main/src/tap/README.md)) - Macro Placer ([mpl](../main/src/mpl/README.md)) - RePlAce Global Placer ([gpl](../main/src/gpl/README.md)) - Gate resizing and buffering ([rsz](../main/src/rsz/README.md)) - Parasitics estimation ([est](../main/src/est/README.md)) - Detailed placement ([dpl](../main/src/dpl/README.md)) - Clock tree synthesis ([cts](../main/src/cts/README.md)) - FastRoute Global routing ([grt](../main/src/grt/README.md)) - Antenna check and diode insertion ([ant](../main/src/ant/README.md)) - TritonRoute Detailed routing ([drt](../main/src/drt/README.md)) - Metal fill insertion ([fin](../main/src/fin/README.md)) - Design for Test ([dft](../main/src/dft/README.md)) - OpenRCX Parasitic Extraction ([rcx](../main/src/rcx/README.md)) - OpenSTA timing/power analyzer ([sta](https://github.com/The-OpenROAD-Project/OpenSTA/blob/master/README.md)) - Graphical User Interface ([gui](../main/src/gui/README.md)) - Static IR analyzer ([psm](../main/src/psm/README.md)) - Example tool ([exa](../main/src/exa/README.md)) ## Tool Checklist Tools should make every attempt to minimize external dependencies. Linking libraries other than those currently in use complicates the builds and sacrifices the portability of OpenROAD. OpenROAD should be portable to many different compiler/operating system versions and dependencies make this vastly more complicated. 1. OpenROAD submodules reference tool `openroad` branch head. No git `develop`, `openroad_app`, or `openroad_build` branches. 2. Submodules used by more than one tool belong in `src/`, not duplicated in each tool repo. 3. `CMakeLists.txt` does not use add_compile_options include_directories link_directories link_libraries. Use target_ versions instead. See tips [here](https://gist.github.com/mbinna/c61dbb39bca0e4fb7d1f73b0d66a4fd1). 4. `CMakeLists.txt` does not use glob. Use explicit lists of source files and headers instead. 5. `CMakeLists.txt` does not define `CFLAGS` `CMAKE_CXX_FLAGS` `CMAKE_CXX_FLAGS_DEBUG` `CMAKE_CXX_FLAGS_RELEASE`. Let the top level and defaults control these. 6. No `main.cpp` or main procedure. 7. No compiler warnings for GCC or Clang with optimization enabled. 8. Does not call `flute::readLUT` (called once by `openroad`). 9. Tcl command(s) documented in top level `README.md` in flow order. 10. Command line tool documentation in tool README. 11. Conforms to Tcl command naming standards (no camel case). 12. Does not read configuration files. Use command arguments or support commands. 13. `.clang-format` at tool root directory to aid foreign programmers. 14. No `jenkins/`, `Jenkinsfile`, `Dockerfile` in tool directory. 15. `regression` script named `test/regression` with no arguments that runs tests. Not `tests/regression-tcl.sh`, not `test/run_tests.py` etc. 16. `regression` script should run independent of current directory. For example, `../test/regression` should work. 17. `regression` should only print test results or summary, not belch 1000s of lines of output. 18. Test scripts use OpenROAD tcl commands (not `itcl`, not internal accessors). 19. `regression` script should only write files in a directory that is in the tool’s `.gitignore` so the hierarchy does not have modified files in it as a result or running the regressions. 20. Regressions report no memory errors with `valgrind` (stretch goal). 21. Regressions report no memory leaks with `valgrind` (difficult). 22. Ensure the top-level README and Tcl format are compliant. ## Code Linting and Formatting OpenROAD uses both `clang-tidy` and `clang-format` to perform automatic linting and formatting whenever a pull request is submitted. To run these locally, please first setup Clang Tooling using this [guide](https://clang.llvm.org/docs/HowToSetupToolingForLLVM.html). Thereafter, you may run these commands: ```shell cmake . -B build # generate build files # typically only run these commands on files you changed. clang-tidy -p ./build source_file.cpp clang-format -i -style=file:.clang-format source_file.cpp ``` To run `clang-tidy` on all files, you can use the following script that runs `clang-tidy` in parallel and also caches the results, so subsequent runs only have to operate on changed files. ```shell cmake . -B build # generate build files ln -sf build/compile_commands.json . # make compilation db visible /bin/sh etc/run-clang-tidy-cached.cc ``` Alternatively, you can run `clang-tidy` hermetically through Bazel — no cmake configuration or Clang Tooling setup is required, and the toolchain matches what CI will use: ```shell # Single module: bazel build --config=lint //src//... # Full lint scope (excludes upstream submodules): bazel build --config=lint -- //src/... //third-party/... \ -//src/sta/... -//third-party/abc/... ``` Reports land under `bazel-bin//_rules_lint/` as `*.AspectRulesLintClangTidy.out` files. Generated files (SWIG, bison, flex) and targets tagged `no-lint` are skipped automatically. ## Doxygen OpenROAD uses Doxygen style comments to generate documentation. See the generated documentation here. Our preferred syntax for Doxygen comments can be found in this [file](). Also, do refer to the official Doxygen documentation for more information on what you can include in your Doxygen comments [here](https://www.doxygen.nl/manual/docblocks.html). Below shows an example snippet taken from `./src/odb/include/odb/db.h`: ```cpp /// /// dbProperty - Int property. /// class dbIntProperty : public dbProperty { public: /// Get the value of this property. int getValue(); /// Set the value of this property. void setValue(int value); /// Create a int property. Returns nullptr if a property with the same name /// already exists. static dbIntProperty* create(dbObject* object, const char* name, int value); /// Find the named property of type int. Returns nullptr if the property does /// not exist. static dbIntProperty* find(dbObject* object, const char* name); }; ``` ## Guidelines 1. Internally, the code should use `int` for all database units and `int64_t` for all area calculations. Refer to this [link](DatabaseMath.md) for a more detailed writeup on the reasons why this approach is preferred. The only place that the database distance units should appear in any program should be in the user interface, as microns are easier for humans than DBUs. # Distributed.html.md # Documentation for distributed detailed routing with Kubernetes and Google cloud. In this tutorial, we introduce how to use distributed detailed routing with a Kubernetes cluster. We will be using a cluster running in google cloud, but the process is similar to using any Kubernetes cluster. ## General System Design ![alt_text](main/src/drt/doc/gsd.jpg) The Diagram above shows four main components to run distributed routing: * The leader: responsible for orchestrating the detailed routing process through creating the routing jobs that the workers need to handle and aggregating the routed chunks. * The load balancer: the leader sends the needed jobs to the load balancer which is responsible for balancing the jobs fairly among the workers and handle failed ones. * The workers: are the components that actually do the detailed routing for the jobs assigned by the leader through the balancer. * Network File System (NFS): has a shared directory accessible by all the other components of the system allowing them to exchange routing data. ## Setting up the cluster on Google Cloud ![alt_text](main/src/drt/doc/create_cluster.gif) * Sign in to your Google cloud console dashboard. * At the top left, select the navigation menu represented by the three lines icon. * Click “Kubernetes Engine” from the menu. * Click the “Create” icon at the top. * From the pop-up, select “Configure” for a GKE standard. * Select the “Cluster basics” section from the leftside menu, then: * Choose the name of the cluster. * Choose the location type as zonal and select the appropriate zone[1](#id3). * Under the “default-pool” section from the leftside menu select “Nodes”, then: * You can configure the type of the machine that your Kuberenets pods would be running on. It is worth noting that a pod (worker/balancer) can acquire a number of CPUs <= the number of cpus available in the machine selected at this stage. This also applies for the memory. * This is all we need, now click “Create” at the bottom of the page. * As the cluster is being created, we move on to setting up a shared folder on a NFS. ## Setting up a shared folder in a Network File System (NFS) A shared folder on a NFS is used to share routing updates between the leader and the workers. There are multiple tutorials for setting up a network shared folder; the link below shows how to create such folder. Two things to consider at this step: 1. The IP of the NFS server must be kept to be used in further steps. 2. The folder will be mounted to the leader’s machine. Mounting is also explained in the tutorial. 3. The machine should be in the same zone of the cluster[1](#id3). [https://www.digitalocean.com/community/tutorials/how-to-set-up-an-nfs-mount-on-ubuntu-20-04](https://www.digitalocean.com/community/tutorials/how-to-set-up-an-nfs-mount-on-ubuntu-20-04) The main steps on the NFS server machine are: 1. run `sudo apt install nfs-kernel-server` and `sudo apt install nfs-common` 2. In the etc/exports file, add the following line replacing ${PATH} with the actual shared directory path you choose and the 10.128 portion with the actual subnet portion of the network you set up: `${PATH} 10.128.0.0/255.255.0.0(rw,no_subtree_check,no_root_squash)` 3. Run `sudo systemctl restart nfs-kernel-server` on the server macine. Now your NFS server machine is ready and the shared directory can be accessed. **N.B:** Since we are using google cloud, we set up our shared folder on a VM instance and record its internal IP to be used in later steps. ## Configuring the cluster In the first step, we created a cluster on Google cloud. In this step we connect to this cluster and configure it. ![alt_text](main/src/drt/doc/connect_to_cluster.gif) 1. Go to your google cloud console. 2. On the top right to the left of the notification icon, click the “Activate cloud shell” icon. 3. Right above the terminal on the right, click the “Open editor” button and wait for it to load. 4. When it is done loading use the following command to autogenerate the kubeconfig that will allow you to access your cluster using “kubectl” commands: ```none gcloud container clusters get-credentials --zone ``` 5. Now your cluster is connected to your Google cloud CLI. 6. The file [k8s-drt.yaml](../test/Distributed/k8s-drt.yaml) is an example configuration file. **However**, you need to replace *${SHARED_FOLDER_PATH}* and *${NFS_SERVER_IP}* with the actual values. ### Explaining configuration file: * Every section of the configuration file is separated by “—” * The first section of the file is a service with the name “workers”, this service is responsible for creating the domain name for the auto discovery of the workers by the loadbalancer node. The domain name is the exact same name of the service, in this case “workers”. Furthermore, the port of the domain server is the same as the port of the service, in this case “1111”. * The second section of the configuration creates a StatefulSet of workers. This section has many important configurations listed below: 1. The value of “replicas” under “spec” represents the number of workers that will be created in the cluster. 2. The value of “serviceName” under “spec” must match the value of the service name in the first section. 3. Under “spec” / “template” / “spec” / “containers”: 1. “image” must have the value of openroad docker image on docker hub. 2. Under “command”, you can find two commands, the first runs openroad. The second runs the tcl file in the shared directory. It’s necessary to change the directory to match your shared folder directory. 3. Under “volumeMounts”, the value of “mountPath” must match the path of the shared directory. 4. Under “env” for the “value” under the name: “MY_POD_CPU” determines the thread count that openroad will be using. 5. Under “resources” / “requests” the value of “cpu” determines the number of cpus assigned to the worker pod. Note that this value should at least match the number provide for the thread count. Further, this value must not exceed the maximum number of cpus of the machines used for the cluster. 6. Under “lifecycle” / “preStop” / “exec” / “command” you should change the directory of the shared folder to match yours. 4. Under “volumes” / “nfs”: 7. The value of “server” must match the value of the IP of the machine that has your NFS. Since we are making the tutorial for google cloud, we use the internal IP of the NFS machine. 8. For the value of “path”, change the directory of the shared folder to match yours. * The third section of the configuration file creates the pod that runs the loadbalancer. The configuration of this section is very similar to what is explained for the second section; therefore, no further explanation is needed. * The fourth section creates the service that connects the pods with the distributed routing leader. The important value in this section is “nodePort” under “spec” / “ports”. This value should be kept to be used later in the leader TCL file. * After editing the file, run the following command in Google cloud console terminal: ```default kubectl apply -f k8s-drt.yaml ``` ### Communicating with the cluster For the leader to communicate with the cluster, we need to supply: 1. The value of the nodePort as discussed in the configuration file section. 2. The IP of any of the virtual machines that carries the workers. The easiest method to obtain that is to enter the following command in the Google cloud console shell: ```default kubectl get pods -o wide ``` The output will carry the IPs of all the up workers and the balancer. Get any of the IPs of the workers and keep it for the next step. ## Leader TCL file An example of the leader tcl file could found at this [link](../test/Distributed/example_leader.tcl). The important parameters to change are the following in the detailed_route command: * remote_host: the IP that you obtained in the previous section. * remote_port: the value of the nodePort from the previous section. * cloud_size: the number of workers as been determined in the yaml script. * shared_volume: the mount path of the nfs shared folder in the leader machine. **N.B:** It is important to make sure that the leader is the last node in the system to run. You can check that the Kubernetes nodes are all running using the following command in the Google cloud terminal: ```default kubectl get pods ``` The output will contain all the pods with their status. Make sure that they are all running. ## Notes --- * **[1]** It is important to note that in this tutorial, we make the router leader, the shared NFS folder, and the cluster all use the same zone on google cloud. # FAQS.html.md # FAQs If you cannot find your question/answer here, please file a GitHub issue to the appropriate repository or start a discussion. - Issues and bugs: - OpenROAD: [https://github.com/The-OpenROAD-Project/OpenROAD/issues](https://github.com/The-OpenROAD-Project/OpenROAD/issues) - Discussions: - OpenROAD: [https://github.com/The-OpenROAD-Project/OpenROAD/discussions](https://github.com/The-OpenROAD-Project/OpenROAD/discussions) ## How can I contribute? Thank you for your willingness to contribute. Please see the [Getting Involved](../contrib/GettingInvolved.md) guide. # GettingInvolved.html.md # Getting Involved Thank you for taking the time to read this document and to contribute. The OpenROAD project will not reach all of its objectives without help! Possible ways to contribute to the OpenROAD application: - Tool improvements - New tools - Improvements to documentation, including this document - Star our project and repos so we can see the number of people who are interested ## Licensing Contributions As much as possible, all contributions should be licensed using the BSD3 license. You can propose another license if you must, but contributions made with BSD3 fit best with the spirit of OpenROAD’s permissive open-source philosophy. We do have exceptions in the project, but over time we hope that all contributions will be BSD3, or some other permissive license such as MIT or Apache2.0. ## Contributing Scripts and Code We follow the [Google C++ style guide](https://google.github.io/styleguide/cppguide.html). If you find code in our project that does *not* follow this guide, then within each file that you edit, follow the style in that file. Please pay careful attention to the [tool checklist](DeveloperGuide.md#tool-checklist) for all code. If you want to add or improve functionality in OpenROAD, please start with the top-level [app](https://github.com/The-OpenROAD-Project/OpenROAD/) repo. You can see in the `src` directory that submodules exist pointing to tested versions of the other relevant repos in the project. Please look at the tool workflow in the developer guide [document](DeveloperGuide.md) to work with the app and its submodule repos in an efficient way. Please run clang-format on all the C++ source files that you change, before committing. In the root directory of the OpenROAD repository there is the file `.clang-format` that defines all coding formatting rules. Please pay attention to the [test directory](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/test) and be sure to add tests for any code changes that you make, using open-source PDK and design information. We provide the `nangate45` PDK in the OpenROAD-flow-scripts repo to help with this. Pull requests with code changes are unlikely to be accepted without accompanying test cases. There are many [examples](https://github.com/The-OpenROAD-Project/OpenROAD/blob/master/test/gcd_nangate45.tcl) tests. Each repo has a test directory as well with tests you should run and add to if you modify something in one of the submodules. For changes that claim to improve QoR or PPA, please run many tests and ensure that the improvement is not design-specific. There are designs in the [OpenROAD-flow-scripts](https://github.com/The-OpenROAD-Project/OpenROAD-flow-scripts/) repo which can be used unless the improvement is technology-specific. Do not add runtime or build dependencies without serious thought. For a project like OpenROAD with many application subcomponents, the software architecture can quickly get out of control. Changes with lots of new dependencies which are not necessary are less likely to be integrated. If you want to add Tcl code to define a new tool command, look at [pdngen](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn) as an example of how to do so. Take a look at the [CMake file](https://github.com/The-OpenROAD-Project/OpenROAD/blob/master/src/CMakeLists.txt) which automatically sources the Tcl code and the [Tcl file](https://github.com/The-OpenROAD-Project/OpenROAD/blob/master/src/pdn/src/pdn.tcl) itself. To accept contributions, we require each commit to be made with a DCO (Developer Certificate of Origin) attached. When you commit you add the `-s` flag to your commit. For example: ```shell git commit -s -m "test dco with -s" ``` This will append a statement to your commit comment that attests to the DCO. GitHub has built in the `-s` option to its command line since use of this is so pervasive. The promise is very basic, certifying that you know that you have the right to commit the code. Please read the [full statement here](https://developercertificate.org/). ## Questions Please refer to our [FAQs](../user/FAQS.md). # GitGuide.html.md # Git Quickstart This tutorial serves as a quickstart to Git and contributing to our repository. If you have not already set up OpenROAD, please follow the instructions [here](../user/Build.md). ## Forking You will need your own fork to work on the code. Go to the `OpenROAD` project [page](https://github.com/The-OpenROAD-Project/OpenROAD) and hit the `Fork` button. You will want to clone your fork to your machine: ```shell git clone https://github.com/your-user-name/OpenROAD.git cd OpenROAD git remote add upstream https://github.com/The-OpenROAD-Project/OpenROAD.git git fetch upstream ``` This creates the directory `OpenROAD` and connects your repository to the upstream (master project) *OpenROAD* repository. ## Creating a branch You want your master branch to reflect only production-ready code, so create a feature branch for making your changes. For example: ```shell git checkout master && git branch shiny-new-feature git checkout shiny-new-feature # Or equivalently, git checkout master && git checkout -b shiny-new-feature ``` This changes your working directory to the shiny-new-feature branch. Keep any changes in this branch specific to one bug or feature so it is clear what the branch brings to OpenROAD. You can have many shiny-new-features and switch in between them using the git checkout command. When creating this branch, make sure your master branch is up to date with the latest upstream master version. To update your local master branch, you can do: ```shell git checkout master git pull upstream master ``` When you want to update the feature branch with changes in master after you created the branch, check the section on [updating a PR](). ## Committing your code Keep style fixes to a separate commit to make your pull request more readable. Once you’ve made changes, you can see them by typing: ```shell git status ``` If you have created a new file, it is not being tracked by git. Add it by typing: ```shell git add path/to/file-to-be-added.py ``` Doing `git status` again should give something like: ```shell # On branch shiny-new-feature # # modified: /relative/path/to/file-you-added.py # ``` Finally, commit your changes to your local repository with an explanatory commit message. Do note the `-s` option is needed for developer signoff. ```shell git commit -s -m "your commit message goes here" ``` ## Pushing your changes When you want your changes to appear publicly on your GitHub page, push your forked feature branch’s commits: ```shell git push origin shiny-new-feature ``` Here `origin` is the default name given to your remote repository on GitHub. You can see the remote repositories: ```shell git remote -v ``` If you added the upstream repository as described above you will see something like: ```shell origin https://github.com/your-user-name/OpenROAD.git (fetch) origin https://github.com/your-user-name/OpenROAD.git (push) upstream https://github.com/The-OpenROAD-Project/OpenROAD.git (fetch) upstream https://github.com/The-OpenROAD-Project/OpenROAD.git (push) ``` Now your code is on GitHub, but it is not yet a part of the OpenROAD project. For that to happen, a pull request needs to be submitted on GitHub. ## Review your code When you’re ready to ask for a code review, file a pull request. Before you do, once again make sure that you have followed all the guidelines outlined in the [Developer’s Guide](DeveloperGuide.md) regarding code style, tests, performance tests, and documentation. You should also double check your branch changes against the branch it was based on: 1. Navigate to your repository on GitHub – https://github.com/your-user-name/OpenROAD 2. Click on `Branches` 3. Click on the `Compare` button for your feature branch 4. Select the `base` and `compare` branches, if necessary. This will be `master` and `shiny-new-feature`, respectively. ## Submitting the pull request If everything looks good, you are ready to make a pull request. A pull request is how code from a local repository becomes available to the GitHub community and can be looked at and eventually merged into the master version. This pull request and its associated changes will eventually be committed to the master branch and available in the next release. To submit a pull request: 1. Navigate to your repository on GitHub 2. Click on the `Compare & pull request` button 3. You can then click on `Commits` and `Files Changed` to make sure everything looks okay one last time 4. Write a description of your changes in the `Preview Discussion` tab 5. Click `Send Pull Request`. This request then goes to the repository maintainers, and they will review the code. ## Updating your pull request Based on the review you get on your pull request, you will probably need to make some changes to the code. In that case, you can make them in your branch, add a new commit to that branch, push it to GitHub, and the pull request will be automatically updated. Pushing them to GitHub again is done by: ```shell git push origin shiny-new-feature ``` This will automatically update your pull request with the latest code and restart the [Continuous Integration](CI.md) tests. Another reason you might need to update your pull request is to solve conflicts with changes that have been merged into the master branch since you opened your pull request. To do this, you need to `merge upstream master` in your branch: ```shell git checkout shiny-new-feature git fetch upstream git merge upstream/master ``` If there are no conflicts (or they could be fixed automatically), a file with a default commit message will open, and you can simply save and quit this file. If there are merge conflicts, you need to solve those conflicts. See this [article](https://help.github.com/articles/resolving-a-merge-conflict-using-the-command-line/) for an explanation on how to do this. Once the conflicts are merged and the files where the conflicts were solved are added, you can run `git commit` to save those fixes. If you have uncommitted changes at the moment you want to update the branch with master, you will need to `stash` them prior to updating. #### SEE ALSO See the stash [docs](https://git-scm.com/book/en/v2/Git-Tools-Stashing-and-Cleaning). This will effectively store your changes and they can be reapplied after updating. After the feature branch has been updated locally, you can now update your pull request by pushing to the branch on GitHub: ```shell git push origin shiny-new-feature ``` ## Tips for a successful pull request If you have made it to the `Review your code` phase, one of the core contributors may take a look. Please note however that a handful of people are responsible for reviewing all of the contributions, which can often lead to bottlenecks. To improve the chances of your pull request being reviewed, you should: - **Reference an open issue** for non-trivial changes to clarify the PR’s purpose - **Ensure you have appropriate tests**. These should be the first part of any PR - **Keep your pull requests as simple as possible**. Larger PRs take longer to review - **Ensure that CI is in a green state**. Reviewers may not even look otherwise - **Keep updating your pull request**, either by request or every few days ## Acknowledgements This page has been adapted from [pandas Developer Guide](https://pandas.pydata.org/docs/development/contributing.html). # LEF_Grammar.html.md # LEF Grammar Railroad Diagrams The LEF (Library Exchange Format) grammar defines the syntax for the library description files read and written by OpenROAD’s ODB module. The grammar is implemented as a Bison parser in [`src/odb/src/lef/lef/lef.y`](../src/lef/lef/lef.y). Railroad diagrams (also called syntax diagrams) give an at-a-glance visual summary of each grammar rule. The SVGs below are generated directly from `lef.y` by [`generate_railroad_diagrams.py`](generate_railroad_diagrams.py) and are regenerated automatically via CI whenever `lef.y` changes. ## Contents - [File structure]() - [Units]() - [Layers]() - [Vias]() - [Via Rules]() - [Spacing]() - [Sites]() - [Macros]() - [Macro Pins]() - [Non-default Rules]() - [Properties]() - [IRDrop]() - [Noise & Correction Tables]() - [Timing]() - [Arrays (Floorplan)]() - [Antenna Rules]() - [Dielectric & Minfeature]() - [Primitives]() ## File structure ### `lef_file` ![lef_file](main/src/odb/doc/images/lef/lef_file.svg) ### `rule` ![rule](main/src/odb/doc/images/lef/rule.svg) ### `version` ![version](main/src/odb/doc/images/lef/version.svg) ### `end_library` ![end_library](main/src/odb/doc/images/lef/end_library.svg) ### `busbitchars` ![busbitchars](main/src/odb/doc/images/lef/busbitchars.svg) ### `dividerchar` ![dividerchar](main/src/odb/doc/images/lef/dividerchar.svg) ### `case_sensitivity` ![case_sensitivity](main/src/odb/doc/images/lef/case_sensitivity.svg) ### `wireextension` ![wireextension](main/src/odb/doc/images/lef/wireextension.svg) ### `fixedmask` ![fixedmask](main/src/odb/doc/images/lef/fixedmask.svg) ### `manufacturing` ![manufacturing](main/src/odb/doc/images/lef/manufacturing.svg) ### `useminspacing` ![useminspacing](main/src/odb/doc/images/lef/useminspacing.svg) ### `clearancemeasure` ![clearancemeasure](main/src/odb/doc/images/lef/clearancemeasure.svg) ### `clearance_type` ![clearance_type](main/src/odb/doc/images/lef/clearance_type.svg) ### `spacing_type` ![spacing_type](main/src/odb/doc/images/lef/spacing_type.svg) ### `spacing_value` ![spacing_value](main/src/odb/doc/images/lef/spacing_value.svg) ### `maxstack_via` ![maxstack_via](main/src/odb/doc/images/lef/maxstack_via.svg) ### `create_file_statement` ![create_file_statement](main/src/odb/doc/images/lef/create_file_statement.svg) ### `extension` ![extension](main/src/odb/doc/images/lef/extension.svg) ### `def_statement` ![def_statement](main/src/odb/doc/images/lef/def_statement.svg) ### `msg_statement` ![msg_statement](main/src/odb/doc/images/lef/msg_statement.svg) ## Units ### `units_section` ![units_section](main/src/odb/doc/images/lef/units_section.svg) ### `start_units` ![start_units](main/src/odb/doc/images/lef/start_units.svg) ### `units_rule` ![units_rule](main/src/odb/doc/images/lef/units_rule.svg) ## Layers ### `layer_rule` ![layer_rule](main/src/odb/doc/images/lef/layer_rule.svg) ### `start_layer` ![start_layer](main/src/odb/doc/images/lef/start_layer.svg) ### `end_layer` ![end_layer](main/src/odb/doc/images/lef/end_layer.svg) ### `layer_option` ![layer_option](main/src/odb/doc/images/lef/layer_option.svg) ### `layer_type` ![layer_type](main/src/odb/doc/images/lef/layer_type.svg) ### `layer_direction` ![layer_direction](main/src/odb/doc/images/lef/layer_direction.svg) ### `layer_name` ![layer_name](main/src/odb/doc/images/lef/layer_name.svg) ### `layer_prop` ![layer_prop](main/src/odb/doc/images/lef/layer_prop.svg) ### `layer_spacing` ![layer_spacing](main/src/odb/doc/images/lef/layer_spacing.svg) ### `layer_spacing_cut_routing` ![layer_spacing_cut_routing](main/src/odb/doc/images/lef/layer_spacing_cut_routing.svg) ### `layer_spacing_opt` ![layer_spacing_opt](main/src/odb/doc/images/lef/layer_spacing_opt.svg) ### `layer_spacingtable_opt` ![layer_spacingtable_opt](main/src/odb/doc/images/lef/layer_spacingtable_opt.svg) ### `layer_enclosure_type_opt` ![layer_enclosure_type_opt](main/src/odb/doc/images/lef/layer_enclosure_type_opt.svg) ### `layer_enclosure_width_opt` ![layer_enclosure_width_opt](main/src/odb/doc/images/lef/layer_enclosure_width_opt.svg) ### `layer_enclosure_width_except_opt` ![layer_enclosure_width_except_opt](main/src/odb/doc/images/lef/layer_enclosure_width_except_opt.svg) ### `layer_preferenclosure_width_opt` ![layer_preferenclosure_width_opt](main/src/odb/doc/images/lef/layer_preferenclosure_width_opt.svg) ### `layer_minimumcut_within` ![layer_minimumcut_within](main/src/odb/doc/images/lef/layer_minimumcut_within.svg) ### `layer_minimumcut_from` ![layer_minimumcut_from](main/src/odb/doc/images/lef/layer_minimumcut_from.svg) ### `layer_minimumcut_length` ![layer_minimumcut_length](main/src/odb/doc/images/lef/layer_minimumcut_length.svg) ### `layer_minstep_option` ![layer_minstep_option](main/src/odb/doc/images/lef/layer_minstep_option.svg) ### `layer_minstep_type` ![layer_minstep_type](main/src/odb/doc/images/lef/layer_minstep_type.svg) ### `layer_minen_width` ![layer_minen_width](main/src/odb/doc/images/lef/layer_minen_width.svg) ### `layer_oxide` ![layer_oxide](main/src/odb/doc/images/lef/layer_oxide.svg) ### `layer_exceptpgnet` ![layer_exceptpgnet](main/src/odb/doc/images/lef/layer_exceptpgnet.svg) ### `layer_arraySpacing_long` ![layer_arraySpacing_long](main/src/odb/doc/images/lef/layer_arraySpacing_long.svg) ### `layer_arraySpacing_width` ![layer_arraySpacing_width](main/src/odb/doc/images/lef/layer_arraySpacing_width.svg) ### `layer_arraySpacing_arraycut` ![layer_arraySpacing_arraycut](main/src/odb/doc/images/lef/layer_arraySpacing_arraycut.svg) ### `layer_sp_parallel_width` ![layer_sp_parallel_width](main/src/odb/doc/images/lef/layer_sp_parallel_width.svg) ### `layer_sp_TwoWidth` ![layer_sp_TwoWidth](main/src/odb/doc/images/lef/layer_sp_TwoWidth.svg) ### `layer_sp_TwoWidthsPRL` ![layer_sp_TwoWidthsPRL](main/src/odb/doc/images/lef/layer_sp_TwoWidthsPRL.svg) ### `layer_sp_influence_width` ![layer_sp_influence_width](main/src/odb/doc/images/lef/layer_sp_influence_width.svg) ### `layer_antenna_duo` ![layer_antenna_duo](main/src/odb/doc/images/lef/layer_antenna_duo.svg) ### `layer_antenna_pwl` ![layer_antenna_pwl](main/src/odb/doc/images/lef/layer_antenna_pwl.svg) ### `layer_diffusion_ratio` ![layer_diffusion_ratio](main/src/odb/doc/images/lef/layer_diffusion_ratio.svg) ### `layer_diffusion_ratios` ![layer_diffusion_ratios](main/src/odb/doc/images/lef/layer_diffusion_ratios.svg) ### `layer_table_type` ![layer_table_type](main/src/odb/doc/images/lef/layer_table_type.svg) ### `layer_frequency` ![layer_frequency](main/src/odb/doc/images/lef/layer_frequency.svg) ### `ac_layer_table_opt` ![ac_layer_table_opt](main/src/odb/doc/images/lef/ac_layer_table_opt.svg) ### `dc_layer_table` ![dc_layer_table](main/src/odb/doc/images/lef/dc_layer_table.svg) ### `sp_options` ![sp_options](main/src/odb/doc/images/lef/sp_options.svg) ### `res_point` ![res_point](main/src/odb/doc/images/lef/res_point.svg) ### `cap_point` ![cap_point](main/src/odb/doc/images/lef/cap_point.svg) ### `current_density_pwl` ![current_density_pwl](main/src/odb/doc/images/lef/current_density_pwl.svg) ### `spacing_cut_layer_opt` ![spacing_cut_layer_opt](main/src/odb/doc/images/lef/spacing_cut_layer_opt.svg) ## Vias ### `via` ![via](main/src/odb/doc/images/lef/via.svg) ### `via_keyword` ![via_keyword](main/src/odb/doc/images/lef/via_keyword.svg) ### `start_via` ![start_via](main/src/odb/doc/images/lef/start_via.svg) ### `end_via` ![end_via](main/src/odb/doc/images/lef/end_via.svg) ### `via_option` ![via_option](main/src/odb/doc/images/lef/via_option.svg) ### `via_other_options` ![via_other_options](main/src/odb/doc/images/lef/via_other_options.svg) ### `via_other_option` ![via_other_option](main/src/odb/doc/images/lef/via_other_option.svg) ### `via_viarule` ![via_viarule](main/src/odb/doc/images/lef/via_viarule.svg) ### `via_viarule_option` ![via_viarule_option](main/src/odb/doc/images/lef/via_viarule_option.svg) ### `via_foreign` ![via_foreign](main/src/odb/doc/images/lef/via_foreign.svg) ### `start_foreign` ![start_foreign](main/src/odb/doc/images/lef/start_foreign.svg) ### `via_layer_rule` ![via_layer_rule](main/src/odb/doc/images/lef/via_layer_rule.svg) ### `via_layer` ![via_layer](main/src/odb/doc/images/lef/via_layer.svg) ### `via_geometry` ![via_geometry](main/src/odb/doc/images/lef/via_geometry.svg) ### `via_placement` ![via_placement](main/src/odb/doc/images/lef/via_placement.svg) ### `via_name` ![via_name](main/src/odb/doc/images/lef/via_name.svg) ### `via_name_value_pair` ![via_name_value_pair](main/src/odb/doc/images/lef/via_name_value_pair.svg) ## Via Rules ### `viarule` ![viarule](main/src/odb/doc/images/lef/viarule.svg) ### `viarule_generate` ![viarule_generate](main/src/odb/doc/images/lef/viarule_generate.svg) ### `viarule_keyword` ![viarule_keyword](main/src/odb/doc/images/lef/viarule_keyword.svg) ### `viarule_generate_default` ![viarule_generate_default](main/src/odb/doc/images/lef/viarule_generate_default.svg) ### `viarule_layer_list` ![viarule_layer_list](main/src/odb/doc/images/lef/viarule_layer_list.svg) ### `viarule_layer` ![viarule_layer](main/src/odb/doc/images/lef/viarule_layer.svg) ### `viarule_layer_name` ![viarule_layer_name](main/src/odb/doc/images/lef/viarule_layer_name.svg) ### `viarule_layer_option` ![viarule_layer_option](main/src/odb/doc/images/lef/viarule_layer_option.svg) ### `viarule_prop` ![viarule_prop](main/src/odb/doc/images/lef/viarule_prop.svg) ### `opt_viarule_props` ![opt_viarule_props](main/src/odb/doc/images/lef/opt_viarule_props.svg) ## Spacing ### `spacing_rule` ![spacing_rule](main/src/odb/doc/images/lef/spacing_rule.svg) ### `start_spacing` ![start_spacing](main/src/odb/doc/images/lef/start_spacing.svg) ### `end_spacing` ![end_spacing](main/src/odb/doc/images/lef/end_spacing.svg) ### `spacing` ![spacing](main/src/odb/doc/images/lef/spacing.svg) ### `samenet_keyword` ![samenet_keyword](main/src/odb/doc/images/lef/samenet_keyword.svg) ### `opt_samenetPGonly` ![opt_samenetPGonly](main/src/odb/doc/images/lef/opt_samenetPGonly.svg) ### `opt_adjacentcuts_exceptsame` ![opt_adjacentcuts_exceptsame](main/src/odb/doc/images/lef/opt_adjacentcuts_exceptsame.svg) ### `opt_endofline` ![opt_endofline](main/src/odb/doc/images/lef/opt_endofline.svg) ### `opt_endofline_twoedges` ![opt_endofline_twoedges](main/src/odb/doc/images/lef/opt_endofline_twoedges.svg) ### `opt_range_second` ![opt_range_second](main/src/odb/doc/images/lef/opt_range_second.svg) ### `opt_def_value` ![opt_def_value](main/src/odb/doc/images/lef/opt_def_value.svg) ### `opt_def_range` ![opt_def_range](main/src/odb/doc/images/lef/opt_def_range.svg) ### `opt_def_dvalue` ![opt_def_dvalue](main/src/odb/doc/images/lef/opt_def_dvalue.svg) ## Sites ### `site` ![site](main/src/odb/doc/images/lef/site.svg) ### `start_site` ![start_site](main/src/odb/doc/images/lef/start_site.svg) ### `end_site` ![end_site](main/src/odb/doc/images/lef/end_site.svg) ### `site_option` ![site_option](main/src/odb/doc/images/lef/site_option.svg) ### `site_class` ![site_class](main/src/odb/doc/images/lef/site_class.svg) ### `site_symmetry` ![site_symmetry](main/src/odb/doc/images/lef/site_symmetry.svg) ### `site_symmetry_statement` ![site_symmetry_statement](main/src/odb/doc/images/lef/site_symmetry_statement.svg) ### `site_word` ![site_word](main/src/odb/doc/images/lef/site_word.svg) ### `site_rowpattern` ![site_rowpattern](main/src/odb/doc/images/lef/site_rowpattern.svg) ### `site_rowpattern_statement` ![site_rowpattern_statement](main/src/odb/doc/images/lef/site_rowpattern_statement.svg) ### `sitePattern` ![sitePattern](main/src/odb/doc/images/lef/sitePattern.svg) ### `core_type` ![core_type](main/src/odb/doc/images/lef/core_type.svg) ### `pad_type` ![pad_type](main/src/odb/doc/images/lef/pad_type.svg) ### `endcap_type` ![endcap_type](main/src/odb/doc/images/lef/endcap_type.svg) ## Macros ### `macro` ![macro](main/src/odb/doc/images/lef/macro.svg) ### `start_macro` ![start_macro](main/src/odb/doc/images/lef/start_macro.svg) ### `end_macro` ![end_macro](main/src/odb/doc/images/lef/end_macro.svg) ### `macro_option` ![macro_option](main/src/odb/doc/images/lef/macro_option.svg) ### `macro_class` ![macro_class](main/src/odb/doc/images/lef/macro_class.svg) ### `macro_source` ![macro_source](main/src/odb/doc/images/lef/macro_source.svg) ### `macro_symmetry` ![macro_symmetry](main/src/odb/doc/images/lef/macro_symmetry.svg) ### `macro_symmetry_statement` ![macro_symmetry_statement](main/src/odb/doc/images/lef/macro_symmetry_statement.svg) ### `macro_size` ![macro_size](main/src/odb/doc/images/lef/macro_size.svg) ### `macro_origin` ![macro_origin](main/src/odb/doc/images/lef/macro_origin.svg) ### `macro_foreign` ![macro_foreign](main/src/odb/doc/images/lef/macro_foreign.svg) ### `macro_eeq` ![macro_eeq](main/src/odb/doc/images/lef/macro_eeq.svg) ### `macro_leq` ![macro_leq](main/src/odb/doc/images/lef/macro_leq.svg) ### `macro_generator` ![macro_generator](main/src/odb/doc/images/lef/macro_generator.svg) ### `macro_generate` ![macro_generate](main/src/odb/doc/images/lef/macro_generate.svg) ### `macro_clocktype` ![macro_clocktype](main/src/odb/doc/images/lef/macro_clocktype.svg) ### `macro_power` ![macro_power](main/src/odb/doc/images/lef/macro_power.svg) ### `macro_fixedMask` ![macro_fixedMask](main/src/odb/doc/images/lef/macro_fixedMask.svg) ### `macro_density` ![macro_density](main/src/odb/doc/images/lef/macro_density.svg) ### `density_layer` ![density_layer](main/src/odb/doc/images/lef/density_layer.svg) ### `density_layer_rect` ![density_layer_rect](main/src/odb/doc/images/lef/density_layer_rect.svg) ## Macro Pins ### `macro_pin` ![macro_pin](main/src/odb/doc/images/lef/macro_pin.svg) ### `start_macro_pin` ![start_macro_pin](main/src/odb/doc/images/lef/start_macro_pin.svg) ### `end_macro_pin` ![end_macro_pin](main/src/odb/doc/images/lef/end_macro_pin.svg) ### `macro_pin_option` ![macro_pin_option](main/src/odb/doc/images/lef/macro_pin_option.svg) ### `macro_pin_use` ![macro_pin_use](main/src/odb/doc/images/lef/macro_pin_use.svg) ### `macro_scan_use` ![macro_scan_use](main/src/odb/doc/images/lef/macro_scan_use.svg) ### `macro_port_class_option` ![macro_port_class_option](main/src/odb/doc/images/lef/macro_port_class_option.svg) ### `macro_site` ![macro_site](main/src/odb/doc/images/lef/macro_site.svg) ### `macro_site_word` ![macro_site_word](main/src/odb/doc/images/lef/macro_site_word.svg) ### `start_macro_port` ![start_macro_port](main/src/odb/doc/images/lef/start_macro_port.svg) ### `macro_obs` ![macro_obs](main/src/odb/doc/images/lef/macro_obs.svg) ### `start_macro_obs` ![start_macro_obs](main/src/odb/doc/images/lef/start_macro_obs.svg) ### `pin_shape` ![pin_shape](main/src/odb/doc/images/lef/pin_shape.svg) ### `pin_layer_oxide` ![pin_layer_oxide](main/src/odb/doc/images/lef/pin_layer_oxide.svg) ### `pin_name_value_pair` ![pin_name_value_pair](main/src/odb/doc/images/lef/pin_name_value_pair.svg) ### `geometries` ![geometries](main/src/odb/doc/images/lef/geometries.svg) ### `geometry` ![geometry](main/src/odb/doc/images/lef/geometry.svg) ### `maskColor` ![maskColor](main/src/odb/doc/images/lef/maskColor.svg) ## Non-default Rules ### `nondefault_rule` ![nondefault_rule](main/src/odb/doc/images/lef/nondefault_rule.svg) ### `end_nd_rule` ![end_nd_rule](main/src/odb/doc/images/lef/end_nd_rule.svg) ### `nd_hardspacing` ![nd_hardspacing](main/src/odb/doc/images/lef/nd_hardspacing.svg) ### `nd_rule` ![nd_rule](main/src/odb/doc/images/lef/nd_rule.svg) ### `nd_layer` ![nd_layer](main/src/odb/doc/images/lef/nd_layer.svg) ### `nd_layer_stmt` ![nd_layer_stmt](main/src/odb/doc/images/lef/nd_layer_stmt.svg) ### `nd_prop` ![nd_prop](main/src/odb/doc/images/lef/nd_prop.svg) ### `usevia` ![usevia](main/src/odb/doc/images/lef/usevia.svg) ### `useviarule` ![useviarule](main/src/odb/doc/images/lef/useviarule.svg) ### `mincuts` ![mincuts](main/src/odb/doc/images/lef/mincuts.svg) ## Properties ### `prop_def_section` ![prop_def_section](main/src/odb/doc/images/lef/prop_def_section.svg) ### `prop_define` ![prop_define](main/src/odb/doc/images/lef/prop_define.svg) ### `prop_stmt` ![prop_stmt](main/src/odb/doc/images/lef/prop_stmt.svg) ### `relop` ![relop](main/src/odb/doc/images/lef/relop.svg) ## IRDrop ### `irdrop` ![irdrop](main/src/odb/doc/images/lef/irdrop.svg) ### `start_irdrop` ![start_irdrop](main/src/odb/doc/images/lef/start_irdrop.svg) ### `end_irdrop` ![end_irdrop](main/src/odb/doc/images/lef/end_irdrop.svg) ### `ir_table` ![ir_table](main/src/odb/doc/images/lef/ir_table.svg) ### `ir_tablename` ![ir_tablename](main/src/odb/doc/images/lef/ir_tablename.svg) ### `ir_table_value` ![ir_table_value](main/src/odb/doc/images/lef/ir_table_value.svg) ## Noise & Correction Tables ### `noisetable` ![noisetable](main/src/odb/doc/images/lef/noisetable.svg) ### `end_noisetable` ![end_noisetable](main/src/odb/doc/images/lef/end_noisetable.svg) ### `noise_table_entry` ![noise_table_entry](main/src/odb/doc/images/lef/noise_table_entry.svg) ### `correctiontable` ![correctiontable](main/src/odb/doc/images/lef/correctiontable.svg) ### `end_correctiontable` ![end_correctiontable](main/src/odb/doc/images/lef/end_correctiontable.svg) ### `correction_table_item` ![correction_table_item](main/src/odb/doc/images/lef/correction_table_item.svg) ### `corr_victim` ![corr_victim](main/src/odb/doc/images/lef/corr_victim.svg) ### `victim` ![victim](main/src/odb/doc/images/lef/victim.svg) ### `universalnoisemargin` ![universalnoisemargin](main/src/odb/doc/images/lef/universalnoisemargin.svg) ### `edgeratethreshold1` ![edgeratethreshold1](main/src/odb/doc/images/lef/edgeratethreshold1.svg) ### `edgeratescalefactor` ![edgeratescalefactor](main/src/odb/doc/images/lef/edgeratescalefactor.svg) ### `edgeratethreshold2` ![edgeratethreshold2](main/src/odb/doc/images/lef/edgeratethreshold2.svg) ## Timing ### `timing` ![timing](main/src/odb/doc/images/lef/timing.svg) ### `start_timing` ![start_timing](main/src/odb/doc/images/lef/start_timing.svg) ### `end_timing` ![end_timing](main/src/odb/doc/images/lef/end_timing.svg) ### `timing_option` ![timing_option](main/src/odb/doc/images/lef/timing_option.svg) ### `slew_spec` ![slew_spec](main/src/odb/doc/images/lef/slew_spec.svg) ### `delay_or_transition` ![delay_or_transition](main/src/odb/doc/images/lef/delay_or_transition.svg) ### `risefall` ![risefall](main/src/odb/doc/images/lef/risefall.svg) ### `unateness` ![unateness](main/src/odb/doc/images/lef/unateness.svg) ### `electrical_direction` ![electrical_direction](main/src/odb/doc/images/lef/electrical_direction.svg) ### `one_pin_trigger` ![one_pin_trigger](main/src/odb/doc/images/lef/one_pin_trigger.svg) ### `two_pin_trigger` ![two_pin_trigger](main/src/odb/doc/images/lef/two_pin_trigger.svg) ### `from_pin_trigger` ![from_pin_trigger](main/src/odb/doc/images/lef/from_pin_trigger.svg) ### `to_pin_trigger` ![to_pin_trigger](main/src/odb/doc/images/lef/to_pin_trigger.svg) ### `table_entry` ![table_entry](main/src/odb/doc/images/lef/table_entry.svg) ### `output_list` ![output_list](main/src/odb/doc/images/lef/output_list.svg) ### `output_resistance_entry` ![output_resistance_entry](main/src/odb/doc/images/lef/output_resistance_entry.svg) ### `one_cap` ![one_cap](main/src/odb/doc/images/lef/one_cap.svg) ### `then` ![then](main/src/odb/doc/images/lef/then.svg) ### `else` ![else](main/src/odb/doc/images/lef/else.svg) ### `b_expr` ![b_expr](main/src/odb/doc/images/lef/b_expr.svg) ### `s_expr` ![s_expr](main/src/odb/doc/images/lef/s_expr.svg) ### `expression` ![expression](main/src/odb/doc/images/lef/expression.svg) ### `dtrm` ![dtrm](main/src/odb/doc/images/lef/dtrm.svg) ## Arrays (Floorplan) ### `array` ![array](main/src/odb/doc/images/lef/array.svg) ### `start_array` ![start_array](main/src/odb/doc/images/lef/start_array.svg) ### `end_array` ![end_array](main/src/odb/doc/images/lef/end_array.svg) ### `array_rule` ![array_rule](main/src/odb/doc/images/lef/array_rule.svg) ### `gcellPattern` ![gcellPattern](main/src/odb/doc/images/lef/gcellPattern.svg) ### `trackPattern` ![trackPattern](main/src/odb/doc/images/lef/trackPattern.svg) ### `sitePattern` ![sitePattern](main/src/odb/doc/images/lef/sitePattern.svg) ### `stepPattern` ![stepPattern](main/src/odb/doc/images/lef/stepPattern.svg) ### `floorplan_start` ![floorplan_start](main/src/odb/doc/images/lef/floorplan_start.svg) ### `floorplan_element` ![floorplan_element](main/src/odb/doc/images/lef/floorplan_element.svg) ## Antenna Rules ### `input_antenna` ![input_antenna](main/src/odb/doc/images/lef/input_antenna.svg) ### `output_antenna` ![output_antenna](main/src/odb/doc/images/lef/output_antenna.svg) ### `inout_antenna` ![inout_antenna](main/src/odb/doc/images/lef/inout_antenna.svg) ### `antenna_input` ![antenna_input](main/src/odb/doc/images/lef/antenna_input.svg) ### `antenna_inout` ![antenna_inout](main/src/odb/doc/images/lef/antenna_inout.svg) ### `antenna_output` ![antenna_output](main/src/odb/doc/images/lef/antenna_output.svg) ## Dielectric & Minfeature ### `dielectric` ![dielectric](main/src/odb/doc/images/lef/dielectric.svg) ### `minfeature` ![minfeature](main/src/odb/doc/images/lef/minfeature.svg) ## Primitives ### `pt` ![pt](main/src/odb/doc/images/lef/pt.svg) ### `firstPt` ![firstPt](main/src/odb/doc/images/lef/firstPt.svg) ### `nextPt` ![nextPt](main/src/odb/doc/images/lef/nextPt.svg) ### `otherPts` ![otherPts](main/src/odb/doc/images/lef/otherPts.svg) ### `orientation` ![orientation](main/src/odb/doc/images/lef/orientation.svg) ### `int_number` ![int_number](main/src/odb/doc/images/lef/int_number.svg) ### `int_number_list` ![int_number_list](main/src/odb/doc/images/lef/int_number_list.svg) ### `number_list` ![number_list](main/src/odb/doc/images/lef/number_list.svg) ### `opt_layer_name` ![opt_layer_name](main/src/odb/doc/images/lef/opt_layer_name.svg) ### `req_layer_name` ![req_layer_name](main/src/odb/doc/images/lef/req_layer_name.svg) ## Regenerating the diagrams After editing `lef.y`, re-run: ```shell python3 src/odb/doc/generate_railroad_diagrams.py lef ``` Java 11 or later must be on `PATH`. The WAR tools are vendored in `src/odb/doc/tools/` and are not downloaded at runtime. # LintTargets.html.md # Bazel Lint Targets Bazel lint targets provide a single entry point for running linters and auto-formatters locally, with all tool versions managed by Bazel — no manual installs needed. ## Why Bazel for linting? Managing linter dependencies is a surprisingly painful part of development. Each tool has its own version, its own install method (`pip`, `npm`, `go install`, distro packages), and its own set of transitive dependencies that can conflict with each other or with the project. CI scripts paper over this with ad-hoc `pip install` steps pinned in YAML files that drift out of sync, break silently, and can’t be tested locally without replicating the exact CI environment. Bazel solves this by treating linter tools as hermetic dependencies — the same way it treats compilers and libraries. Tool versions are pinned in `bazel/requirements.in` (for pip packages) or `MODULE.bazel` (for Bazel modules), lock files ensure reproducibility, and `bazelisk test //:lint_test` works identically on every developer’s machine and in CI. No virtualenvs, no “works on my machine”, no guessing which version of `tclint` CI is running. ## Quick start ```bash # Run all lint checks (~0.3s, no C++ build) bazelisk test //:lint_test # Auto-fix then lint bazelisk run //:fix_lint ``` ## Target naming convention The `_test` suffix is a Bazel convention: `bazelisk test` discovers and runs targets whose name ends in `_test`. `//:lint_test` is the top-level test suite that aggregates all per-language lint checks — running `bazelisk test //:lint_test` checks every language supported by this framework. Targets follow a consistent `{verb}_{language}` pattern so that adding a new language is mechanical and the naming is predictable: | Pattern | Scope | Purpose | |-----------------------|---------------|-------------------------------------------| | `//:fix_lint` | all languages | Umbrella: auto-fix then lint everything | | `//:lint_test` | all languages | Umbrella: run all lint checks (read-only) | | `//:lint_{lang}_test` | one language | Lint check (read-only) | | `//:fmt_{lang}_test` | one language | Format check (read-only) | | `//:tidy_{lang}` | one language | Auto-format only | Adding a new language means adding per-language targets and wiring them into the two umbrella targets. ## Available targets | Target | Type | What it does | |--------------------|--------------|-------------------------------------------------------| | `//:lint_test` | `test_suite` | Umbrella: runs all lint checks | | `//:fix_lint` | `sh_binary` | Umbrella: auto-fixes what can be fixed, then lints | | `//:lint_tcl_test` | `sh_test` | Runs `tclint .` (lint rules) | | `//:fmt_tcl_test` | `sh_test` | Runs `tclfmt --check .` (formatting) | | `//:tidy_tcl` | `sh_binary` | Runs `tclfmt --in-place .` (auto-format) | | `//:lint_bzl_test` | `sh_test` | Runs `buildifier -mode=check -lint=warn` (lint rules) | | `//:fmt_bzl_test` | `sh_test` | Runs `buildifier -mode=check -lint=off` (formatting) | | `//:tidy_bzl` | `sh_binary` | Runs `buildifier -mode=fix -lint=fix` (auto-format) | ## Configuration TCL linting and formatting are controlled by `tclint.toml` at the repository root. See the [tclint documentation](https://tclint.readthedocs.io/) for available options. Bazel formatting and linting are controlled by `.buildifier.json` at the repository root. The test scripts (`bzl_lint_test.sh`, `bzl_fmt_test.sh`) explicitly pass `-mode=check` to override the default `mode: fix` in that config, ensuring they remain read-only checks. ## POLA `//:fix_lint` follows the [Principle of Least Astonishment](https://en.wikipedia.org/wiki/Principle_of_least_astonishment): it fixes what it can (e.g. `tclfmt --in-place`) and exits with an error if any lint violations remain that require manual intervention (e.g. `line-length`). A developer who runs `fix_lint` before pushing should never be surprised by a CI lint failure. ## Adding new linters The umbrella targets (`//:lint_test` and `//:fix_lint`) are designed for extension. To add a new linter (e.g., C++ tidy): 1. Add the tool dependency to `bazel/requirements.in` (pip) or as a Bazel module dependency 2. Create a wrapper script in `bazel/` (e.g., `bazel/cpp_tidy.sh`) 3. Add `sh_test` / `sh_binary` targets in `BUILD.bazel` 4. Wire into umbrellas: - Add the new test to the `//:lint_test` `test_suite` - Add a call in `bazel/fix_lint.sh` ## Planned additions The following linters and formatters are planned for `//:lint_test` and `//:fix_lint`, replacing their ad-hoc CI equivalents: - **C++ clang-format** — formatting check/fix for C++ and header files - **Python ruff** — lint + format for Python scripts in `etc/`, `docs/`, tests - **ShellCheck** — lint for bash scripts in `test/`, `bazel/`, `etc/` - **Duplicate message ID check** — replace Jenkins “Find Duplicated Message IDs” stage - **Doc consistency checks** — replace Jenkins “Documentation Checks” stage (`man_tcl_check`, `readme_msgs_check`) The goal is to phase out hand-coded GitHub Actions YAML and Jenkins scripts in favor of Bazel-managed targets that are reproducible, version-pinned, and testable locally with a single command. ## Relationship to CI The GitHub Actions workflow (`.github/workflows/github-actions-lint-tcl.yml`) runs the same `tclint` and `tclfmt` checks. Once Bazel lint targets are validated in CI, the GitHub Actions workflow can be retired. The same applies to the Jenkins documentation and duplicate ID check stages. C++ clang-tidy is provided via a separate Bazel aspect (`--config=lint`) rather than the `//:lint_test` umbrella. Aspects participate in Bazel’s per-action cache, which the `sh_test`-based umbrella does not, so incremental C++ lint scales better that way. See the “Code Linting and Formatting” section of `docs/contrib/DeveloperGuide.md` for usage. # Logger.html.md # Using the Logging Infrastructure OpenROAD uses [spdlog](https://isocpp.org/blog/2014/11/spdlog) as part of logging infrastructure in order to ensure a clear, consistent messaging and complete messaging interface. A wrapper formats the prefix in the recommended messaging style and limit. A message format is as follows: ```text - . ``` For example, ```text [INFO ODB-0127] Reading DEF file: ./results/asap7/aes/base/4_cts.def ``` All output from OpenROAD tools should be directed through the logging API to ensure that redirection, file logging and execution control flow are handled consistently. This also includes messages from any third-party tool. Use the ‘ord’ message ID for third-party tools. The logging infrastructure also supports generating a [JSON](https://www.json.org) file containing design metrics (e.g., area or slack). This output is directed to a user-specified file. The OpenROAD application has a `-metrics` command line argument to specify the file. ## Handling Messages OpenROAD supports multiple levels of severity for message outputs: critical, error, warning, information and debug. These are supported by automatic calls to the logger which will then prefix the appropriate severity type to the message. ## C++20 Requirements In C++20 the logger messages are checked during compile time which introduces restrictions around rutime format strings. See [docs](https://fmt.dev/latest/api.html#compile-time-format-string-checks). OpenROAD uses `spdlog` which uses `fmt_lib` under the hood. Below is an example of what is no longer allowed. In order to make use of runtime format strings, we have introduced a `FMT_RUNTIME` macro in Logger.h. You should use this macro any time you pass a dynamic string as the format string ```c++ logger_->info("{} {}", a, b); // OK void blah(std::string template& a) { logger_->info(a, c); // Illegal logger_->info(FMT_RUNTIME(a), c); // Ok } ``` ## Messaging Guidelines In addition to the proper use of message types, follow the guidelines below to compose messages for clarity, consistency and other guidelines: ### Grammar Start with a capital letter and end with a period, besides well-known exceptions. Use capital letters for file formats and tool proper names, e.g., LEF, DEF, SPICE, FLUTE. After the first word’s capitalization, do not use capital letters (aside from obvious exceptions, such as RSMT, hCut, etc.). Do not use exclamations. Severity must be communicated by message severity and clear implied or explicit action. Avoid long, verbose messages. Use commas to list and separate clauses in messages. Spellcheck all messages using American English spellings. Use ellipsis `...` only to indicate a pause, as when some tool is running or being initialized. ### Abbreviations and Shortcuts Use single-word versions when well-accepted / well-understood by users and developers. Examples: `stdcell, cutline, wirelength, flipchip, padring, bondpad, wirebond, libcell, viarule`. Do not abbreviate or truncate English words; expand for the sake of clarity. ```text Incorrect: Num, #; Tot. ``` ```text Correct: Number; Total ``` Use acceptable, well-understood abbreviations for brevity. Examples: `db, tech, lib, inst, term, params, etc`. Avoid contractions of action words: ```text Incorrect: Can't, Can not; Don't ``` ```text Correct: Cannot; Do not ``` ### Actionability Messages should communicate a clear, implied or explicit action that is necessary for flow continuation or improved quality of results. ```text Example: A value for core_area must be specified in the footprint specification, or in the environment variable CORE_AREA. ``` ### Clarity Messages must be clear and complete, so as to communicate necessary and sufficient information and actions. Elaborate specific variables, options, and/or parameters to avoid any ambiguity. ```text Example: Unrecognized argument $arg, should be one of -pitch, -bump_pin_name, -spacing_to_edge, -cell_name, -bumps_per_tile, -rdl_layer, -rdl_width, -rdl_spacing. ``` Specify objects clearly in the local context: ```text Example: cutWithin is smaller than cutSpacing for ADJACENTCUTS on layer {}. Please check your rule definition. Incomplete: Warning: {} does not have viaDef aligned with layer. ``` Make any assumptions or use of default values explicit: ```text Example: No net slacks found. Timing-driven mode disabled. Incomplete, missing default: Utilization exceeds 100%. ``` Use simple language, and avoid repetitions: ```text Example: Missing orientation for cell $cell_ref. Incorrect: No orientation available for orientation of $cell_ref. ``` ### Message Types OpenROAD supports the following levels of severity through the logger: report, debug, information, warning, error and critical. #### Report Report messages are output by the tool in the form of a report to the user. Examples include timing paths or power analysis results. Example report message: ```text Path startpoint: $startpoint ``` #### Debug Debug messages are only of use to tool developers and not to end users. These messages are not shown unless explicitly enabled. #### Information Information messages may be used to report metrics, quality of results, or program status to the user. Any message which indicates runtime problems, such as potential faulty input or other internal program issues, should be issued at a higher status level. Example information messages: ```text Number of input ports: 47 Running optimization iteration 2 Current cell site utilization: 57.1567% ``` #### Warning Warnings should be used to indicate atypical runtime conditions that may affect quality, but not correctness, of the output. Any conditions that affect correctness should be issued at a higher status level. Example warning messages: ```text Core area utilization is greater than 90%. The generated cell placement may not be routable. 14 outputs are not constrained for max capacitance. Pin 'A[0]' on instance 'mem01' does not contain antenna information and will not be checked for antenna violations. ``` #### Error Error messages should be used to indicate correctness problems. Problems with command arguments are a good example of where error messages are appropriate. Errors exit the current command by throwing an exception that is converted to an error in Tcl. Errors that occur while reading a command file stop execution of the script commands. Example error messages: ```text Invalid selection: net 'test0' does not exist in the design. Cell placement cannot be run before floorplanning. Argument 'max_routing_layer' expects an integer value from 1 to 10. ``` #### Critical Critical messages should be used to indicate correctness problems that the program is not able to work around or ignore, and that require immediate exiting of the program (abort). Example critical messages: ```text Database 'chip' has been corrupted and is not recoverable. Unable to allocate heap memory for array 'vertexIndices'. The required memory size may exceed host machine limits. Assertion failed: 'nodeVisited == false' on line 122 of example.cpp. Please file a Github issue and attach a testcase. ``` ## Coding Each status message requires: - The three letter tool ID - The message ID - The message string - Optionally, additional arguments to fill in placeholders in the message string Reporting is simply printing and does not require a tool or message ID. The tool ID comes from a fixed enumeration of all the tools in the system. This enumeration is in `Logger.h`. New abbreviations should be added after discussion with the OpenROAD system architects. The abbreviation matches the C++ namespace for the tool. Message IDs are integers. They are expected to be unique for each tool. This has the benefit that a message can be mapped to the source code unambiguously even if the text is not unique. Maintaining this invariant is the tool owner’s responsibility. To ensure that the IDs are unique, each tool should maintain a file named ‘messages.txt’ in the top-level tool directory, listing the message IDs along with the format string. When code that uses a message ID is removed, the ID should be retired by removing it from ‘messages.txt’. See the utility `etc/find_messages.py` to scan a tool directory and write a `messages.txt` file. Spdlog comes with the `fmt` library which supports message formatting in a python or [C++20 like style](https://en.cppreference.com/w/cpp/utility/format/formatter#Standard_format_specification). The message string should not include the tool ID or message ID which will automatically be prepended. A trailing newline will automatically be added, and hence messages should not end with one. Messages should be written as complete sentences and end in a period. Multi-line messages may contain embedded new lines. Some examples: ```cpp logger->report("Path startpoint: {}", startpoint); logger->error(ODB, 25, "Unable to open LEF file {}.", file_name); logger->info(DRT, 42, "Routed {} nets in {:3.2f}s.", net_count, elapsed_time); ``` Tcl functions for reporting messages are defined in the OpenROAD swig file `OpenRoad.i`. The message is simply a Tcl string (no C++20 formatting). ```cpp utl::report "Path startpoint: $startpoint" utl::error ODB 25 "Unable to open LEF file $file_name." utl::info DRT 42 "Routed $net_count nets in [format %3.2f $elapsed_time]." ``` `utl::report` should be used instead of ‘puts’ so that all output is logged. Calls to the Tcl functions `utl::warn` and `utl::error` with a single message argument report with tool `ID UKN` and message `ID 0000`. Tools use `#include utl/Logger.h` that defines the logger API. The Logger instance is owned by the OpenROAD instance. Each tool should retrieve the logger instance in the tool init function called after the tool make function by the OpenROAD application. Every tool swig file must include src/Exception.i so that errors thrown by `utl::error` are caught at the Tcl command level. Use the following swig command before `%inline`. ```swig %include "../../Exception.i" ``` The logger functions are shown below. ```cpp Logger::report(const std::string& message, const Args&... args) Logger::info(ToolId tool, int id, const std::string& message, const Args&... args) Logger::warn(ToolId tool, int id, const std::string& message, const Args&... args) Logger::error(ToolId tool, int id, const std::string& message, const Args&... args) Logger::critical(ToolId tool, int id, const std::string& message, const Args&... args) ``` The corresponding Tcl functions are shown below. ```tcl utl::report message utl::info tool id message utl::warn tool id message utl::error tool id message utl::critical tool id message ``` Although there is a `utl::critical` function, it is really difficult to imagine any circumstances that would justify aborting execution of the application in a tcl function. ### Debug Messages Debug messages have a different programming model. As they are most often *not* issued the concern is to avoid slowing down normal execution. For this reason such messages are issued by using the debugPrint macro. This macro will avoid evaluating its arguments if they are not going to be printed. The API is: ```cpp debugPrint(logger, tool, group, level, message, ...); ``` The `debug()` method of the Logger class should not be called directly. No message id is used as these messages are not intended for end users. The level is printed as the message id in the output. The argument types are as for the info/warn/error/critical messages. The one additional argument is group which is a `const char*`. Its purpose is to allow the enabling of subsets of messages within one tool. Debug messages are enabled with the tcl command: `set_debug_level ` ## Metrics The metrics logging uses a more restricted API since JSON only supports specific types. There are a set of overloaded methods of the form: ```cpp metric(ToolId tool, const std::string_view metric, value) ``` where `` can be `int, double, string, or bool`. This will result in the generated JSON: ```text "-" : value ``` String values will be enclosed in double-quotes automatically. ## Converting to Logger The error functions in `include/openroad/Error.hh` should no longer be included or used. Use the corresponding logger functions. All uses of the tcl functions ord::error and ord::warn should be updated call the `utl::error/warn` with a tool ID and message ID. For compatibility these are defaulted to `UKN` and `0000` until they are updated. Regression tests should not have any `UKN-0000` messages in their ok files. A simple grep should indicate that you still have pending calls to pre-logger error/warn functions. The `cmake` file for the tool must also be updated to include spdlog in the link libraries so it can find the header files if they are not in the normal system directories. ```cmake target_link_libraries( PUBLIC utl ) ``` ## Useful Information As tool developers, we can also choose to include useful information to the end user - be it in the form on debugging tips, or solutions to fix the errors/warnings. We compile a list of such errors in this [table](https://openroad.readthedocs.io/en/latest/user/MessagesFinal.html). The good thing about this page is the ability to encode rich formatting using Markdown, enabling you to convey more information than what can be said from the limited messages in code. To format the information, refer to this sample GRT information file. In addition, make sure you create the corresponding `docs/messages` folder under the `tool` folder, before creating your Markdown file with the corresponding `NUM`. ```shell cd src/ && mkdir -p doc/messages cd doc/messages && touch .md ``` ### OpenROAD Tool List A full list of tool namespaces can be found [here](DeveloperGuide.md#tool-flow-namespace). # MessagesFinal.html.md # OpenROAD Messages Glossary Listed below are the OpenROAD warning/errors you may encounter while using the application. | Tool | Code | Filename:Line Number | Type | Information | |--------|--------|---------------------------------------------------------------------------------------------------------------------------------------------------------|----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | ANT | 0001 | [AntennaChecker.cc:1260](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ant/src/AntennaChecker.cc#L1260) | INFO | - | | ANT | 0002 | [AntennaChecker.cc:1258](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ant/src/AntennaChecker.cc#L1258) | INFO | - | | ANT | 0003 | [AntennaChecker.tcl:16](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ant/src/AntennaChecker.tcl#L16) | ERROR | - | | ANT | 0008 | [AntennaChecker.cc:1205](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ant/src/AntennaChecker.cc#L1205) | ERROR | - | | ANT | 0010 | [AntennaChecker.tcl:35](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ant/src/AntennaChecker.tcl#L35) | WARN | - | | ANT | 0011 | [AntennaChecker.tcl:38](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ant/src/AntennaChecker.tcl#L38) | WARN | - | | ANT | 0012 | [AntennaChecker.i:38](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ant/src/AntennaChecker.i#L38) | ERROR | - | | ANT | 0013 | [AntennaChecker.cc:189](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ant/src/AntennaChecker.cc#L189) | WARN | - | | ANT | 0014 | [AntennaChecker.cc:1228](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ant/src/AntennaChecker.cc#L1228) | ERROR | - | | ANT | 0015 | [WireBuilder.cc:103](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ant/src/WireBuilder.cc#L103) | ERROR | - | | ANT | 0016 | [WireBuilder.cc:179](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ant/src/WireBuilder.cc#L179) | ERROR | - | | ANT | 0017 | [WireBuilder.cc:618](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ant/src/WireBuilder.cc#L618) | ERROR | - | | CGT | 0001 | [ClockGating.cpp:1487](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cgt/src/ClockGating.cpp#L1487) | ERROR | - | | CGT | 0002 | [ClockGating.cpp:488](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cgt/src/ClockGating.cpp#L488) | WARN | - | | CGT | 0003 | [ClockGating.cpp:478](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cgt/src/ClockGating.cpp#L478) | INFO | - | | CGT | 0004 | [ClockGating.cpp:589](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cgt/src/ClockGating.cpp#L589) | INFO | - | | CGT | 0005 | [ClockGating.cpp:612](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cgt/src/ClockGating.cpp#L612) | INFO | - | | CGT | 0006 | [NetworkBuilder.cpp:129](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cgt/src/NetworkBuilder.cpp#L129) | ERROR | - | | CGT | 0007 | [NetworkBuilder.cpp:132](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cgt/src/NetworkBuilder.cpp#L132) | ERROR | - | | CGT | 0008 | [NetworkBuilder.cpp:135](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cgt/src/NetworkBuilder.cpp#L135) | ERROR | - | | CGT | 0009 | [NetworkBuilder.cpp:138](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cgt/src/NetworkBuilder.cpp#L138) | ERROR | - | | CGT | 0010 | [ClockGating.cpp:460](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cgt/src/ClockGating.cpp#L460) | WARN | - | | CGT | 0011 | [NetworkBuilder.cpp:67](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cgt/src/NetworkBuilder.cpp#L67) | WARN | - | | CGT | 0012 | [ClockGating.cpp:1306](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cgt/src/ClockGating.cpp#L1306) | ERROR | - | | CHK | 0001 | [IpChecker.cc:40](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/IpChecker.cc#L40) | WARN | - | | CHK | 0002 | [IpChecker.cc:54](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/IpChecker.cc#L54) | WARN | - | | CHK | 0003 | [IpChecker.cc:62](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/IpChecker.cc#L62) | ERROR | - | | CHK | 0004 | [IpChecker.cc:88](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/IpChecker.cc#L88) | WARN | - | | CHK | 0005 | [IpChecker.cc:74](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/IpChecker.cc#L74) | WARN | - | | CHK | 0006 | [IpChecker.cc:93](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/IpChecker.cc#L93) | ERROR | - | | CHK | 0007 | [dbSta.tcl:186](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbSta.tcl#L186) | ERROR | - | | CHK | 0008 | [IpChecker.cc:107](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/IpChecker.cc#L107) | INFO | - | | CHK | 0010 | [IpChecker.cc:144](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/IpChecker.cc#L144) | WARN | - | | CHK | 0011 | [IpChecker.cc:154](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/IpChecker.cc#L154) | WARN | - | | CHK | 0012 | [IpChecker.cc:215](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/IpChecker.cc#L215) | INFO | - | | CHK | 0020 | [IpChecker.cc:185](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/IpChecker.cc#L185) | WARN | - | | CHK | 0030 | [IpChecker.cc:333](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/IpChecker.cc#L333) | WARN | - | | CHK | 0040 | [IpChecker.cc:497](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/IpChecker.cc#L497) | WARN | - | | CHK | 0060 | [IpChecker.cc:527](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/IpChecker.cc#L527) | WARN | - | | CHK | 0070 | [IpChecker.cc:550](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/IpChecker.cc#L550) | WARN | - | | CHK | 0080 | [IpChecker.cc:579](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/IpChecker.cc#L579) | INFO | - | | CHK | 0090 | [IpChecker.cc:602](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/IpChecker.cc#L602) | WARN | - | | CHK | 0100 | [IpChecker.cc:643](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/IpChecker.cc#L643) | WARN | - | | CHK | 0110 | [IpChecker.cc:680](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/IpChecker.cc#L680) | WARN | - | | CTS | 0001 | [TritonCTS.cpp:283](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L283) | INFO | - | | CTS | 0007 | [TritonCTS.cpp:1261](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L1261) | INFO | - | | CTS | 0008 | [TritonCTS.cpp:1286](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L1286) | INFO | - | | CTS | 0010 | [TritonCTS.cpp:1407](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L1407) | INFO | - | | CTS | 0011 | [TritonCTS.cpp:1535](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L1535) | INFO | - | | CTS | 0012 | [TritonCTS.cpp:1791](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L1791) | INFO | - | | CTS | 0013 | [TritonCTS.cpp:1793](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L1793) | INFO | - | | CTS | 0014 | [TritonCTS.cpp:1797](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L1797) | INFO | - | | CTS | 0015 | [TritonCTS.cpp:1801](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L1801) | INFO | - | | CTS | 0016 | [TritonCTS.cpp:1810](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L1810) | INFO | - | | CTS | 0017 | [TritonCTS.cpp:1814](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L1814) | INFO | - | | CTS | 0018 | [TritonCTS.cpp:2085](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L2085) | INFO | - | | CTS | 0019 | [HTreeBuilder.cpp:221](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/HTreeBuilder.cpp#L221) | INFO | - | | CTS | 0020 | [HTreeBuilder.cpp:280](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/HTreeBuilder.cpp#L280) | INFO | - | | CTS | 0021 | [HTreeBuilder.cpp:289](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/HTreeBuilder.cpp#L289) | INFO | - | | CTS | 0022 | [HTreeBuilder.cpp:297](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/HTreeBuilder.cpp#L297) | INFO | - | | CTS | 0023 | [HTreeBuilder.cpp:322](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/HTreeBuilder.cpp#L322) | INFO | - | | CTS | 0024 | [HTreeBuilder.cpp:339](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/HTreeBuilder.cpp#L339) | INFO | - | | CTS | 0025 | [HTreeBuilder.cpp:340](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/HTreeBuilder.cpp#L340) | INFO | - | | CTS | 0026 | [HTreeBuilder.cpp:341](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/HTreeBuilder.cpp#L341) | INFO | - | | CTS | 0027 | [HTreeBuilder.cpp:1209](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/HTreeBuilder.cpp#L1209) | INFO | - | | CTS | 0028 | [HTreeBuilder.cpp:1211](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/HTreeBuilder.cpp#L1211) | INFO | - | | CTS | 0029 | [HTreeBuilder.cpp:1214](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/HTreeBuilder.cpp#L1214) | INFO | - | | CTS | 0030 | [HTreeBuilder.cpp:1241](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/HTreeBuilder.cpp#L1241) | INFO | - | | CTS | 0031 | [HTreeBuilder.cpp:1263](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/HTreeBuilder.cpp#L1263) | INFO | - | | CTS | 0032 | [HTreeBuilder.cpp:1275](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/HTreeBuilder.cpp#L1275) | INFO | - | | CTS | 0033 | [LatencyBalancer.cpp:49](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/LatencyBalancer.cpp#L49) | INFO | - | | CTS | 0034 | [HTreeBuilder.cpp:1443](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/HTreeBuilder.cpp#L1443) | INFO | - | | CTS | 0035 | [HTreeBuilder.cpp:2088](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/HTreeBuilder.cpp#L2088) | INFO | - | | CTS | 0036 | [LatencyBalancer.cpp:58](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/LatencyBalancer.cpp#L58) | INFO | - | | CTS | 0037 | [TritonCTS.cpp:2619](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L2619) | INFO | - | | CTS | 0039 | [TechChar.cpp:1726](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TechChar.cpp#L1726) | INFO | - | | CTS | 0040 | [TritonCTS.cpp:1273](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L1273) | WARN | - | | CTS | 0041 | [TritonCTS.cpp:1400](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L1400) | WARN | - | | CTS | 0042 | [TritonCTS.cpp:2136](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L2136) | WARN | - | | CTS | 0043 | [TechChar.cpp:134](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TechChar.cpp#L134) | WARN | - | | CTS | 0044 | [TritonCTS.cpp:312](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L312) | WARN | - | | CTS | 0045 | [TechChar.cpp:387](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TechChar.cpp#L387) | WARN | - | | CTS | 0046 | [TechChar.cpp:139](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TechChar.cpp#L139) | INFO | - | | CTS | 0047 | [TechChar.cpp:141](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TechChar.cpp#L141) | INFO | - | | CTS | 0048 | [TechChar.cpp:146](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TechChar.cpp#L146) | INFO | - | | CTS | 0049 | [TechChar.cpp:524](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TechChar.cpp#L524) | INFO | - | | CTS | 0050 | [TechChar.cpp:693](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TechChar.cpp#L693) | INFO | - | | CTS | 0051 | [TechChar.cpp:694](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TechChar.cpp#L694) | INFO | - | | CTS | 0052 | [TechChar.cpp:769](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TechChar.cpp#L769) | INFO | - | | CTS | 0053 | [TechChar.cpp:696](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TechChar.cpp#L696) | INFO | - | | CTS | 0056 | [TritonCTS.tcl:513](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.tcl#L513) | ERROR | - | | CTS | 0058 | [SinkClustering.cpp:164](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/SinkClustering.cpp#L164) | ERROR | - | | CTS | 0059 | [HTreeBuilder.cpp:1223](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/HTreeBuilder.cpp#L1223) | INFO | - | | CTS | 0060 | [HTreeBuilder.cpp:1230](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/HTreeBuilder.cpp#L1230) | INFO | - | | CTS | 0065 | [TechChar.cpp:179](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TechChar.cpp#L179) | ERROR | - | | CTS | 0073 | [TechChar.cpp:478](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TechChar.cpp#L478) | ERROR | - | | CTS | 0074 | [TechChar.cpp:710](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TechChar.cpp#L710) | ERROR | - | | CTS | 0075 | [TechChar.cpp:586](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TechChar.cpp#L586) | ERROR | - | | CTS | 0076 | [TechChar.cpp:637](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TechChar.cpp#L637) | ERROR | - | | CTS | 0077 | [TreeBuilder.cpp:112](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TreeBuilder.cpp#L112) | ERROR | - | | CTS | 0078 | [TechChar.cpp:681](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TechChar.cpp#L681) | ERROR | - | | CTS | 0079 | [HTreeBuilder.cpp:155](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/HTreeBuilder.cpp#L155) | ERROR | - | | CTS | 0080 | [HTreeBuilder.cpp:2080](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/HTreeBuilder.cpp#L2080) | ERROR | - | | CTS | 0081 | [TritonCTS.cpp:268](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L268) | ERROR | - | | CTS | 0082 | [TritonCTS.cpp:96](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L96) | WARN | - | | CTS | 0083 | [TritonCTS.cpp:1283](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L1283) | WARN | - | | CTS | 0085 | [TritonCTS.cpp:1771](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L1771) | ERROR | - | | CTS | 0087 | [TritonCTS.cpp:580](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L580) | ERROR | - | | CTS | 0090 | [HTreeBuilder.cpp:1237](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/HTreeBuilder.cpp#L1237) | INFO | - | | CTS | 0095 | [TritonCTS.cpp:1259](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L1259) | INFO | - | | CTS | 0096 | [TechChar.cpp:607](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TechChar.cpp#L607) | ERROR | - | | CTS | 0097 | [TritonCTS.cpp:274](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L274) | INFO | - | | CTS | 0098 | [TritonCTS.cpp:548](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L548) | INFO | - | | CTS | 0099 | [TritonCTS.cpp:549](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L549) | INFO | - | | CTS | 0100 | [TritonCTS.cpp:550](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L550) | INFO | - | | CTS | 0101 | [TritonCTS.cpp:553](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L553) | INFO | - | | CTS | 0102 | [TritonCTS.cpp:555](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L555) | INFO | - | | CTS | 0103 | [TritonCTS.tcl:586](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.tcl#L586) | ERROR | - | | CTS | 0104 | [TechChar.cpp:458](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TechChar.cpp#L458) | WARN | - | | CTS | 0105 | [TritonCTS.cpp:1469](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L1469) | WARN | - | | CTS | 0106 | [TechChar.cpp:715](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TechChar.cpp#L715) | ERROR | - | | CTS | 0107 | [TechChar.cpp:621](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TechChar.cpp#L621) | ERROR | - | | CTS | 0108 | [TechChar.cpp:630](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TechChar.cpp#L630) | ERROR | - | | CTS | 0109 | [TritonCTS.tcl:542](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.tcl#L542) | ERROR | - | | CTS | 0110 | [TritonCTS.cpp:1505](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L1505) | WARN | - | | CTS | 0111 | [TechChar.cpp:504](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TechChar.cpp#L504) | ERROR | - | | CTS | 0112 | [TritonCTS.cpp:826](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L826) | ERROR | - | | CTS | 0113 | [TechChar.cpp:518](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TechChar.cpp#L518) | ERROR | - | | CTS | 0114 | [TritonCTS.cpp:1232](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L1232) | ERROR | - | | CTS | 0115 | [TritonCTS.tcl:436](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.tcl#L436) | WARN | - | | CTS | 0116 | [TritonCTS.cpp:309](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L309) | INFO | - | | CTS | 0117 | [TritonCTS.cpp:820](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L820) | ERROR | - | | CTS | 0118 | [TritonCTS.cpp:2516](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L2516) | ERROR | - | | CTS | 0119 | [TritonCTS.cpp:2543](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L2543) | ERROR | - | | CTS | 0120 | [TritonCTS.cpp:2501](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L2501) | ERROR | - | | CTS | 0121 | [TritonCTS.cpp:469](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L469) | INFO | - | | CTS | 0122 | [TritonCTS.cpp:1301](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L1301) | INFO | - | | CTS | 0123 | [TritonCTS.tcl:550](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.tcl#L550) | ERROR | - | | CTS | 0124 | [TritonCTS.cpp:530](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L530) | INFO | - | | CTS | 0125 | [TritonCTS.cpp:532](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L532) | INFO | - | | CTS | 0126 | [TritonCTS.cpp:685](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L685) | ERROR | - | | CTS | 0127 | [TritonCTS.cpp:719](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L719) | ERROR | - | | CTS | 0128 | [TritonCTS.tcl:556](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.tcl#L556) | WARN | - | | CTS | 0129 | [TritonCTS.tcl:116](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.tcl#L116) | ERROR | - | | CTS | 0130 | [TritonCTS.tcl:147](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.tcl#L147) | ERROR | - | | CTS | 0131 | [TritonCTS.tcl:189](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.tcl#L189) | ERROR | - | | CTS | 0132 | [TritonCTS.tcl:461](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.tcl#L461) | WARN | - | | CTS | 0133 | [TritonCTS.tcl:85](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.tcl#L85) | ERROR | - | | CTS | 0134 | [TritonCTS.tcl:93](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.tcl#L93) | ERROR | - | | CTS | 0135 | [TritonCTS.tcl:79](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.tcl#L79) | ERROR | - | | CTS | 0179 | [LatencyBalancer.cpp:290](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/LatencyBalancer.cpp#L290) | WARN | - | | CTS | 0201 | [TreeBuilder.cpp:118](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TreeBuilder.cpp#L118) | INFO | - | | CTS | 0203 | [TritonCTS.cpp:2242](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L2242) | WARN | - | | CTS | 0204 | [HTreeBuilder.cpp:116](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/HTreeBuilder.cpp#L116) | INFO | - | | CTS | 0205 | [HTreeBuilder.cpp:123](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/HTreeBuilder.cpp#L123) | INFO | - | | CTS | 0206 | [HTreeBuilder.cpp:129](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/HTreeBuilder.cpp#L129) | INFO | - | | CTS | 0207 | [TritonCTS.cpp:557](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L557) | INFO | - | | CTS | 0208 | [TritonCTS.cpp:1945](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L1945) | ERROR | - | | CTS | 0209 | [TritonCTS.cpp:205](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L205) | ERROR | - | | CTS | 0210 | [TritonCTS.cpp:211](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L211) | INFO | - | | CTS | 0211 | [TritonCTS.tcl:301](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.tcl#L301) | INFO | - | | CTS | 0212 | [TritonCTS.tcl:305](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.tcl#L305) | INFO | - | | CTS | 0213 | [TritonCTS.tcl:309](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.tcl#L309) | INFO | - | | CTS | 0214 | [TritonCTS.tcl:319](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.tcl#L319) | INFO | - | | CTS | 0215 | [TritonCTS.tcl:323](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.tcl#L323) | INFO | - | | CTS | 0216 | [TritonCTS.tcl:327](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.tcl#L327) | INFO | - | | CTS | 0217 | [TritonCTS.tcl:331](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.tcl#L331) | INFO | - | | CTS | 0218 | [TritonCTS.tcl:335](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.tcl#L335) | INFO | - | | CTS | 0219 | [TritonCTS.tcl:339](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.tcl#L339) | INFO | - | | CTS | 0220 | [TritonCTS.tcl:343](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.tcl#L343) | INFO | - | | CTS | 0221 | [TritonCTS.tcl:347](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.tcl#L347) | INFO | - | | CTS | 0222 | [TritonCTS.tcl:351](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.tcl#L351) | INFO | - | | CTS | 0223 | [TritonCTS.tcl:355](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.tcl#L355) | INFO | - | | CTS | 0224 | [TritonCTS.tcl:359](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.tcl#L359) | INFO | - | | CTS | 0225 | [TritonCTS.tcl:363](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.tcl#L363) | INFO | - | | CTS | 0226 | [TritonCTS.tcl:367](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.tcl#L367) | INFO | - | | CTS | 0227 | [TritonCTS.tcl:371](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.tcl#L371) | INFO | - | | CTS | 0228 | [TritonCTS.tcl:375](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.tcl#L375) | INFO | - | | CTS | 0229 | [TritonCTS.tcl:379](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.tcl#L379) | INFO | - | | CTS | 0369 | [TritonCTS.cpp:370](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TritonCTS.cpp#L370) | ERROR | - | | CTS | 0534 | [TechChar.cpp:542](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TechChar.cpp#L542) | ERROR | - | | CTS | 0541 | [TechChar.cpp:547](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/TechChar.cpp#L547) | ERROR | - | | CTS | 0542 | [CtsOptions.h:174](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/CtsOptions.h#L174) | ERROR | - | | CTS | 0543 | [CtsOptions.h:191](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cts/src/CtsOptions.h#L191) | ERROR | - | | CUT | 0001 | [blif.cpp:75](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/blif.cpp#L75) | ERROR | - | | CUT | 0002 | [blif.cpp:332](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/blif.cpp#L332) | INFO | - | | CUT | 0003 | [blif.cpp:356](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/blif.cpp#L356) | ERROR | - | | CUT | 0004 | [blif.cpp:380](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/blif.cpp#L380) | ERROR | - | | CUT | 0005 | [blif.cpp:394](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/blif.cpp#L394) | ERROR | - | | CUT | 0006 | [blif.cpp:402](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/blif.cpp#L402) | INFO | - | | CUT | 0007 | [blif.cpp:406](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/blif.cpp#L406) | INFO | - | | CUT | 0008 | [blif.cpp:431](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/blif.cpp#L431) | INFO | - | | CUT | 0009 | [blif.cpp:450](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/blif.cpp#L450) | INFO | - | | CUT | 0010 | [blif.cpp:494](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/blif.cpp#L494) | INFO | - | | CUT | 0011 | [blif.cpp:515](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/blif.cpp#L515) | ERROR | - | | CUT | 0012 | [blif.cpp:549](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/blif.cpp#L549) | INFO | - | | CUT | 0013 | [blif.cpp:571](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/blif.cpp#L571) | INFO | - | | CUT | 0014 | [abc_library_factory.cpp:152](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/abc_library_factory.cpp#L152) | ERROR | - | | CUT | 0015 | [abc_library_factory.cpp:160](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/abc_library_factory.cpp#L160) | ERROR | - | | CUT | 0016 | [abc_library_factory.cpp:172](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/abc_library_factory.cpp#L172) | ERROR | - | | CUT | 0017 | [abc_library_factory.cpp:319](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/abc_library_factory.cpp#L319) | ERROR | - | | CUT | 0018 | [abc_library_factory.cpp:337](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/abc_library_factory.cpp#L337) | ERROR | - | | CUT | 0019 | [abc_library_factory.cpp:381](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/abc_library_factory.cpp#L381) | ERROR | - | | CUT | 0020 | [abc_library_factory.cpp:385](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/abc_library_factory.cpp#L385) | ERROR | - | | CUT | 0021 | [abc_library_factory.cpp:515](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/abc_library_factory.cpp#L515) | WARN | - | | CUT | 0022 | [abc_library_factory.cpp:556](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/abc_library_factory.cpp#L556) | ERROR | - | | CUT | 0023 | [abc_library_factory.cpp:582](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/abc_library_factory.cpp#L582) | ERROR | - | | CUT | 0024 | [logic_cut.cpp:152](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/logic_cut.cpp#L152) | ERROR | - | | CUT | 0025 | [logic_cut.cpp:181](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/logic_cut.cpp#L181) | ERROR | - | | CUT | 0026 | [logic_cut.cpp:199](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/logic_cut.cpp#L199) | ERROR | - | | CUT | 0027 | [logic_cut.cpp:221](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/logic_cut.cpp#L221) | ERROR | - | | CUT | 0028 | [logic_cut.cpp:301](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/logic_cut.cpp#L301) | ERROR | - | | CUT | 0029 | [logic_cut.cpp:333](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/logic_cut.cpp#L333) | ERROR | - | | CUT | 0030 | [logic_cut.cpp:394](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/logic_cut.cpp#L394) | ERROR | - | | CUT | 0031 | [logic_cut.cpp:404](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/logic_cut.cpp#L404) | ERROR | - | | CUT | 0032 | [logic_cut.cpp:436](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/logic_cut.cpp#L436) | ERROR | - | | CUT | 0033 | [logic_cut.cpp:479](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/logic_cut.cpp#L479) | ERROR | - | | CUT | 0034 | [logic_cut.cpp:488](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/logic_cut.cpp#L488) | ERROR | - | | CUT | 0035 | [logic_cut.cpp:590](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/logic_cut.cpp#L590) | ERROR | - | | CUT | 0036 | [logic_cut.cpp:602](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/logic_cut.cpp#L602) | ERROR | - | | CUT | 0037 | [logic_cut.cpp:613](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/logic_cut.cpp#L613) | ERROR | - | | CUT | 0038 | [logic_cut.cpp:619](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/logic_cut.cpp#L619) | ERROR | - | | CUT | 0039 | [logic_cut.cpp:626](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/logic_cut.cpp#L626) | ERROR | - | | CUT | 0040 | [logic_cut.cpp:645](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/logic_cut.cpp#L645) | ERROR | - | | CUT | 0041 | [logic_cut.cpp:650](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/logic_cut.cpp#L650) | ERROR | - | | CUT | 0042 | [logic_cut.cpp:657](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/logic_cut.cpp#L657) | ERROR | - | | CUT | 0043 | [logic_cut.cpp:676](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/logic_cut.cpp#L676) | ERROR | - | | CUT | 0044 | [logic_cut.cpp:682](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/logic_cut.cpp#L682) | ERROR | - | | CUT | 0045 | [logic_cut.cpp:710](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/logic_cut.cpp#L710) | ERROR | - | | CUT | 0046 | [logic_cut.cpp:717](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/logic_cut.cpp#L717) | ERROR | - | | CUT | 0047 | [logic_extractor.cpp:138](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/logic_extractor.cpp#L138) | ERROR | - | | CUT | 0048 | [logic_extractor.cpp:359](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/logic_extractor.cpp#L359) | ERROR | - | | CUT | 0049 | [abc_library_factory.cpp:261](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/cut/src/abc_library_factory.cpp#L261) | ERROR | - | | DFT | 0001 | [dft.tcl:14](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dft/src/dft.tcl#L14) | ERROR | - | | DFT | 0002 | [ScanReplace.cpp:410](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dft/src/replace/ScanReplace.cpp#L410) | WARN | - | | DFT | 0003 | [ScanReplace.cpp:400](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dft/src/replace/ScanReplace.cpp#L400) | INFO | - | | DFT | 0004 | [ClockDomainHash.cpp:29](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dft/src/clock_domain/ClockDomainHash.cpp#L29) | ERROR | - | | DFT | 0005 | [ScanCellFactory.cpp:139](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dft/src/cells/ScanCellFactory.cpp#L139) | WARN | - | | DFT | 0006 | [dft.i:114](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dft/src/dft.i#L114) | ERROR | - | | DFT | 0007 | [ScanCellFactory.cpp:148](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dft/src/cells/ScanCellFactory.cpp#L148) | WARN | - | | DFT | 0008 | [dft.tcl:28](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dft/src/dft.tcl#L28) | ERROR | - | | DFT | 0009 | [dft.tcl:40](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dft/src/dft.tcl#L40) | ERROR | - | | DFT | 0010 | [Opt.cpp:83](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dft/src/architect/Opt.cpp#L83) | ERROR | - | | DFT | 0011 | [ScanCellFactory.cpp:50](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dft/src/cells/ScanCellFactory.cpp#L50) | WARN | - | | DFT | 0012 | [ScanReplace.cpp:382](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dft/src/replace/ScanReplace.cpp#L382) | WARN | - | | DFT | 0013 | [dft.tcl:107](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dft/src/dft.tcl#L107) | ERROR | - | | DFT | 0014 | [Dft.cpp:192](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dft/src/Dft.cpp#L192) | WARN | - | | DFT | 0018 | [Utils.cpp:159](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dft/src/utils/Utils.cpp#L159) | ERROR | - | | DFT | 0030 | [ScanCell.hh:110](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dft/src/cells/ScanCell.hh#L110) | ERROR | - | | DFT | 0031 | [Utils.cpp:149](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dft/src/utils/Utils.cpp#L149) | ERROR | - | | DFT | 0034 | [ScanStitch.cpp:155](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dft/src/stitch/ScanStitch.cpp#L155) | ERROR | - | | DFT | 0035 | [ScanStitch.cpp:163](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dft/src/stitch/ScanStitch.cpp#L163) | ERROR | - | | DFT | 0036 | [ScanStitch.cpp:171](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dft/src/stitch/ScanStitch.cpp#L171) | ERROR | - | | DFT | 0037 | [ScanStitch.cpp:212](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dft/src/stitch/ScanStitch.cpp#L212) | ERROR | - | | DFT | 0038 | [ScanStitch.cpp:220](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dft/src/stitch/ScanStitch.cpp#L220) | ERROR | - | | DFT | 0039 | [ScanStitch.cpp:228](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dft/src/stitch/ScanStitch.cpp#L228) | ERROR | - | | DFT | 0040 | [ScanStitch.cpp:241](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dft/src/stitch/ScanStitch.cpp#L241) | ERROR | - | | DFT | 0049 | [ScanCellFactory.cpp:109](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dft/src/cells/ScanCellFactory.cpp#L109) | WARN | - | | DPL | 0001 | [FillerPlacement.cpp:125](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/FillerPlacement.cpp#L125) | INFO | - | | DPL | 0002 | [FillerPlacement.cpp:203](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/FillerPlacement.cpp#L203) | ERROR | - | | DPL | 0003 | [Opendp.tcl:43](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/Opendp.tcl#L43) | WARN | - | | DPL | 0004 | [Opendp.tcl:147](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/Opendp.tcl#L147) | WARN | - | | DPL | 0005 | [Opendp.cpp:179](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/Opendp.cpp#L179) | INFO | - | | DPL | 0006 | [Opendp.cpp:154](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/Opendp.cpp#L154) | INFO | - | | DPL | 0012 | [Grid.cpp:732](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/infrastructure/Grid.cpp#L732) | ERROR | - | | DPL | 0015 | [Place.cpp:374](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/Place.cpp#L374) | ERROR | - | | DPL | 0016 | [Place.cpp:498](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/Place.cpp#L498) | ERROR | - | | DPL | 0017 | [Place.cpp:554](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/Place.cpp#L554) | ERROR | - | | DPL | 0020 | [OptMirror.cpp:84](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/OptMirror.cpp#L84) | INFO | - | | DPL | 0021 | [OptMirror.cpp:86](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/OptMirror.cpp#L86) | INFO | - | | DPL | 0022 | [OptMirror.cpp:90](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/OptMirror.cpp#L90) | INFO | - | | DPL | 0023 | [OptMirror.cpp:97](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/OptMirror.cpp#L97) | INFO | - | | DPL | 0026 | [Place.cpp:1369](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/Place.cpp#L1369) | CRITICAL | - | | DPL | 0027 | [Opendp.tcl:59](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/Opendp.tcl#L59) | ERROR | - | | DPL | 0028 | [Opendp.tcl:354](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/Opendp.tcl#L354) | WARN | - | | DPL | 0029 | [Opendp.tcl:371](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/Opendp.tcl#L371) | ERROR | - | | DPL | 0030 | [Opendp.tcl:387](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/Opendp.tcl#L387) | ERROR | - | | DPL | 0031 | [Opendp.tcl:28](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/Opendp.tcl#L28) | ERROR | - | | DPL | 0032 | [Opendp.tcl:327](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/Opendp.tcl#L327) | ERROR | - | | DPL | 0033 | [CheckPlacement.cpp:136](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/CheckPlacement.cpp#L136) | ERROR | - | | DPL | 0034 | [Opendp.cpp:192](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/Opendp.cpp#L192) | INFO | - | | DPL | 0035 | [Opendp.cpp:197](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/Opendp.cpp#L197) | INFO | - | | DPL | 0036 | [Opendp.cpp:204](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/Opendp.cpp#L204) | ERROR | - | | DPL | 0037 | [Opendp.cpp:136](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/Opendp.cpp#L136) | WARN | - | | DPL | 0038 | [Opendp.cpp:163](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/Opendp.cpp#L163) | ERROR | - | | DPL | 0039 | [Opendp.tcl:358](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/Opendp.tcl#L358) | ERROR | - | | DPL | 0042 | [Opendp.cpp:665](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/Opendp.cpp#L665) | WARN | - | | DPL | 0048 | [CheckPlacement.cpp:158](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/CheckPlacement.cpp#L158) | ERROR | - | | DPL | 0050 | [FillerPlacement.cpp:265](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/FillerPlacement.cpp#L265) | ERROR | - | | DPL | 0051 | [Grid.cpp:721](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/infrastructure/Grid.cpp#L721) | ERROR | - | | DPL | 0054 | [DecapPlacement.cpp:125](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/DecapPlacement.cpp#L125) | ERROR | - | | DPL | 0055 | [DecapPlacement.cpp:106](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/DecapPlacement.cpp#L106) | ERROR | - | | DPL | 0056 | [DecapPlacement.cpp:164](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/DecapPlacement.cpp#L164) | INFO | - | | DPL | 0103 | [Opendp.tcl:135](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/Opendp.tcl#L135) | ERROR | - | | DPL | 0104 | [Opendp.tcl:158](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/Opendp.tcl#L158) | ERROR | - | | DPL | 0105 | [Opendp.tcl:124](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/Opendp.tcl#L124) | ERROR | - | | DPL | 0200 | [legalize_shift.cxx:172](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/legalize_shift.cxx#L172) | WARN | - | | DPL | 0201 | [legalize_shift.cxx:188](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/legalize_shift.cxx#L188) | WARN | - | | DPL | 0202 | [detailed_mis.cxx:156](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_mis.cxx#L156) | INFO | - | | DPL | 0203 | [detailed_random.cxx:356](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_random.cxx#L356) | INFO | - | | DPL | 0300 | [detailed_mis.cxx:129](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_mis.cxx#L129) | INFO | - | | DPL | 0301 | [detailed_mis.cxx:165](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_mis.cxx#L165) | INFO | - | | DPL | 0302 | [detailed_mis.cxx:200](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_mis.cxx#L200) | INFO | - | | DPL | 0303 | [detailed.cxx:137](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed.cxx#L137) | INFO | - | | DPL | 0304 | [detailed_reorder.cxx:93](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_reorder.cxx#L93) | INFO | - | | DPL | 0305 | [detailed_reorder.cxx:107](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_reorder.cxx#L107) | INFO | - | | DPL | 0306 | [detailed_global_legacy.cxx:110](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_global_legacy.cxx#L110) | INFO | - | | DPL | 0307 | [detailed_global_legacy.cxx:122](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_global_legacy.cxx#L122) | INFO | - | | DPL | 0308 | [detailed_vertical.cxx:107](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_vertical.cxx#L107) | INFO | - | | DPL | 0309 | [detailed_vertical.cxx:121](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_vertical.cxx#L121) | INFO | - | | DPL | 0310 | [detailed_manager.cxx:912](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_manager.cxx#L912) | INFO | - | | DPL | 0311 | [detailed_manager.cxx:1227](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_manager.cxx#L1227) | INFO | - | | DPL | 0312 | [detailed_manager.cxx:1283](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_manager.cxx#L1283) | INFO | - | | DPL | 0313 | [detailed_manager.cxx:1463](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_manager.cxx#L1463) | INFO | - | | DPL | 0314 | [detailed_manager.cxx:1521](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_manager.cxx#L1521) | INFO | - | | DPL | 0315 | [detailed_manager.cxx:1552](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_manager.cxx#L1552) | INFO | - | | DPL | 0316 | [detailed_global.cxx:335](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_global.cxx#L335) | INFO | - | | DPL | 0317 | [detailed_abu.cxx:376](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/objective/detailed_abu.cxx#L376) | INFO | - | | DPL | 0318 | [detailed_manager.cxx:1072](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_manager.cxx#L1072) | INFO | - | | DPL | 0319 | [detailed_manager.cxx:1116](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_manager.cxx#L1116) | INFO | - | | DPL | 0320 | [detailed_manager.cxx:1143](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_manager.cxx#L1143) | INFO | - | | DPL | 0321 | [detailed_manager.cxx:1172](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_manager.cxx#L1172) | INFO | - | | DPL | 0322 | [detailed_manager.cxx:262](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_manager.cxx#L262) | INFO | - | | DPL | 0323 | [detailed.cxx:92](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed.cxx#L92) | WARN | - | | DPL | 0324 | [detailed_random.cxx:150](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_random.cxx#L150) | INFO | - | | DPL | 0325 | [detailed_random.cxx:200](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_random.cxx#L200) | INFO | - | | DPL | 0326 | [detailed_random.cxx:222](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_random.cxx#L222) | INFO | - | | DPL | 0327 | [detailed_random.cxx:260](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_random.cxx#L260) | INFO | - | | DPL | 0328 | [detailed_random.cxx:279](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_random.cxx#L279) | INFO | - | | DPL | 0329 | [detailed_random.cxx:348](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_random.cxx#L348) | INFO | - | | DPL | 0330 | [detailed_random.cxx:385](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_random.cxx#L385) | INFO | - | | DPL | 0331 | [detailed_global.cxx:549](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_global.cxx#L549) | INFO | - | | DPL | 0332 | [detailed_random.cxx:445](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_random.cxx#L445) | INFO | - | | DPL | 0333 | [detailed_random.cxx:459](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_random.cxx#L459) | INFO | - | | DPL | 0334 | [detailed_global.cxx:1314](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_global.cxx#L1314) | INFO | - | | DPL | 0335 | [detailed_random.cxx:614](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_random.cxx#L614) | INFO | - | | DPL | 0336 | [detailed_vertical.cxx:390](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_vertical.cxx#L390) | INFO | - | | DPL | 0337 | [detailed_random.cxx:786](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_random.cxx#L786) | INFO | - | | DPL | 0338 | [detailed_random.cxx:478](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_random.cxx#L478) | INFO | - | | DPL | 0339 | [detailed_manager.cxx:1344](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_manager.cxx#L1344) | WARN | - | | DPL | 0340 | [detailed_manager.cxx:1354](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_manager.cxx#L1354) | WARN | - | | DPL | 0341 | [detailed.cxx:135](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed.cxx#L135) | ERROR | - | | DPL | 0342 | [Opendp.tcl:179](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/Opendp.tcl#L179) | ERROR | - | | DPL | 0343 | [Opendp.tcl:183](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/Opendp.tcl#L183) | WARN | - | | DPL | 0344 | [Opendp.tcl:200](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/Opendp.tcl#L200) | ERROR | - | | DPL | 0345 | [Opendp.tcl:223](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/Opendp.tcl#L223) | ERROR | - | | DPL | 0346 | [Opendp.tcl:268](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/Opendp.tcl#L268) | ERROR | - | | DPL | 0347 | [Opendp.tcl:262](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/Opendp.tcl#L262) | ERROR | - | | DPL | 0348 | [detailed_global_legacy.cxx:406](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_global_legacy.cxx#L406) | INFO | - | | DPL | 0380 | [detailed_orient.cxx:71](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_orient.cxx#L71) | INFO | - | | DPL | 0381 | [detailed_orient.cxx:82](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_orient.cxx#L82) | WARN | - | | DPL | 0382 | [detailed_orient.cxx:88](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_orient.cxx#L88) | INFO | - | | DPL | 0383 | [detailed_orient.cxx:97](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_orient.cxx#L97) | INFO | - | | DPL | 0384 | [detailed_orient.cxx:102](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_orient.cxx#L102) | INFO | - | | DPL | 0385 | [detailed_random.cxx:532](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_random.cxx#L532) | ERROR | - | | DPL | 0386 | [dbToOpendp.cpp:290](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/dbToOpendp.cpp#L290) | ERROR | - | | DPL | 0387 | [dbToOpendp.cpp:285](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/dbToOpendp.cpp#L285) | WARN | - | | DPL | 0400 | [detailed_manager.cxx:146](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_manager.cxx#L146) | ERROR | - | | DPL | 0401 | [detailed_manager.cxx:109](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_manager.cxx#L109) | INFO | - | | DPL | 0402 | [detailed_manager.cxx:127](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_manager.cxx#L127) | INFO | - | | DPL | 0700 | [NegotiationLegalizerPass.cpp:113](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/NegotiationLegalizerPass.cpp#L113) | WARN | - | | DPL | 0701 | [Opendp.cpp:228](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/Opendp.cpp#L228) | WARN | - | | DPL | 0702 | [NegotiationLegalizerPass.cpp:166](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/NegotiationLegalizerPass.cpp#L166) | WARN | - | | DPL | 0901 | [detailed_global.cxx:1163](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_global.cxx#L1163) | INFO | - | | DPL | 0902 | [detailed_global.cxx:1278](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_global.cxx#L1278) | WARN | - | | DPL | 0903 | [detailed_global.cxx:1297](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_global.cxx#L1297) | INFO | - | | DPL | 0905 | [detailed_global.cxx:263](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_global.cxx#L263) | INFO | - | | DPL | 0906 | [detailed_global.cxx:287](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_global.cxx#L287) | INFO | - | | DPL | 0907 | [detailed_global.cxx:309](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_global.cxx#L309) | INFO | - | | DPL | 0908 | [detailed_global.cxx:355](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_global.cxx#L355) | INFO | - | | DPL | 0909 | [detailed_global.cxx:375](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_global.cxx#L375) | INFO | - | | DPL | 0910 | [detailed_global.cxx:591](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_global.cxx#L591) | INFO | - | | DPL | 0914 | [detailed_global.cxx:642](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_global.cxx#L642) | INFO | - | | DPL | 0915 | [detailed_global.cxx:651](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_global.cxx#L651) | INFO | - | | DPL | 0916 | [detailed_global.cxx:835](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_global.cxx#L835) | INFO | - | | DPL | 0917 | [detailed_global.cxx:364](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_global.cxx#L364) | INFO | - | | DPL | 0919 | [detailed_global.cxx:530](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_global.cxx#L530) | INFO | - | | DPL | 0920 | [detailed_global.cxx:571](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_global.cxx#L571) | INFO | - | | DPL | 0921 | [detailed_global.cxx:522](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_global.cxx#L522) | INFO | - | | DPL | 0924 | [detailed_global.cxx:602](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_global.cxx#L602) | INFO | - | | DPL | 0925 | [detailed_global.cxx:399](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/optimization/detailed_global.cxx#L399) | INFO | - | | DPL | 1101 | [Opendp.cpp:187](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/Opendp.cpp#L187) | INFO | - | | DPL | 1102 | [Opendp.cpp:215](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/Opendp.cpp#L215) | INFO | - | | DPL | 1280 | [Opendp.cpp:378](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/Opendp.cpp#L378) | ERROR | - | | DPL | 1281 | [Opendp.cpp:382](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/Opendp.cpp#L382) | ERROR | - | | DPL | 1300 | [Grid.cpp:908](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dpl/src/infrastructure/Grid.cpp#L908) | ERROR | - | | DRT | 0000 | [FlexDR_init.cpp:720](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/dr/FlexDR_init.cpp#L720) | ERROR | - | | DRT | 0001 | [TritonRoute.cpp:1249](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/TritonRoute.cpp#L1249) | ERROR | - | | DRT | 0002 | [TritonRoute.cpp:241](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/TritonRoute.cpp#L241) | ERROR | - | | DRT | 0003 | [io.cpp:3959](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L3959) | ERROR | - | | DRT | 0004 | [io.cpp:3965](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L3965) | ERROR | - | | DRT | 0005 | [frRegionQuery.cpp:101](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/frRegionQuery.cpp#L101) | ERROR | - | | DRT | 0006 | [frRegionQuery.cpp:112](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/frRegionQuery.cpp#L112) | ERROR | - | | DRT | 0007 | [frRegionQuery.cpp:130](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/frRegionQuery.cpp#L130) | ERROR | - | | DRT | 0011 | [frRegionQuery.cpp:323](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/frRegionQuery.cpp#L323) | ERROR | - | | DRT | 0012 | [frRegionQuery.cpp:333](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/frRegionQuery.cpp#L333) | ERROR | - | | DRT | 0013 | [frRegionQuery.cpp:343](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/frRegionQuery.cpp#L343) | ERROR | - | | DRT | 0014 | [frRegionQuery.cpp:383](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/frRegionQuery.cpp#L383) | ERROR | - | | DRT | 0015 | [frRegionQuery.cpp:400](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/frRegionQuery.cpp#L400) | ERROR | - | | DRT | 0016 | [frRegionQuery.cpp:445](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/frRegionQuery.cpp#L445) | ERROR | - | | DRT | 0017 | [frRegionQuery.cpp:464](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/frRegionQuery.cpp#L464) | ERROR | - | | DRT | 0018 | [frRegionQuery.cpp:629](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/frRegionQuery.cpp#L629) | INFO | - | | DRT | 0019 | [frRegionQuery.cpp:633](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/frRegionQuery.cpp#L633) | INFO | - | | DRT | 0020 | [frRegionQuery.cpp:645](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/frRegionQuery.cpp#L645) | INFO | - | | DRT | 0021 | [frRegionQuery.cpp:649](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/frRegionQuery.cpp#L649) | INFO | - | | DRT | 0022 | [frRegionQuery.cpp:666](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/frRegionQuery.cpp#L666) | INFO | - | | DRT | 0023 | [frRegionQuery.cpp:677](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/frRegionQuery.cpp#L677) | INFO | - | | DRT | 0024 | [frRegionQuery.cpp:687](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/frRegionQuery.cpp#L687) | INFO | - | | DRT | 0026 | [frRegionQuery.cpp:715](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/frRegionQuery.cpp#L715) | INFO | - | | DRT | 0027 | [frRegionQuery.cpp:719](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/frRegionQuery.cpp#L719) | INFO | - | | DRT | 0028 | [frRegionQuery.cpp:730](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/frRegionQuery.cpp#L730) | INFO | - | | DRT | 0029 | [frRegionQuery.cpp:757](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/frRegionQuery.cpp#L757) | INFO | - | | DRT | 0030 | [frRegionQuery.cpp:761](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/frRegionQuery.cpp#L761) | INFO | - | | DRT | 0031 | [frRegionQuery.cpp:141](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/frRegionQuery.cpp#L141) | ERROR | - | | DRT | 0033 | [frRegionQuery.cpp:838](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/frRegionQuery.cpp#L838) | INFO | - | | DRT | 0034 | [frRegionQuery.cpp:866](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/frRegionQuery.cpp#L866) | INFO | - | | DRT | 0035 | [frRegionQuery.cpp:771](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/frRegionQuery.cpp#L771) | INFO | - | | DRT | 0036 | [frRegionQuery.cpp:852](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/frRegionQuery.cpp#L852) | INFO | - | | DRT | 0037 | [FlexGC_init.cpp:90](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/gc/FlexGC_init.cpp#L90) | ERROR | - | | DRT | 0038 | [FlexGC_init.cpp:101](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/gc/FlexGC_init.cpp#L101) | ERROR | - | | DRT | 0039 | [FlexGC_init.cpp:107](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/gc/FlexGC_init.cpp#L107) | ERROR | - | | DRT | 0040 | [TritonRoute.cpp:1028](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/TritonRoute.cpp#L1028) | WARN | - | | DRT | 0041 | [FlexGC_main.cpp:147](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/gc/FlexGC_main.cpp#L147) | WARN | - | | DRT | 0042 | [FlexGC_main.cpp:218](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/gc/FlexGC_main.cpp#L218) | ERROR | - | | DRT | 0043 | [FlexGC_main.cpp:298](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/gc/FlexGC_main.cpp#L298) | WARN | - | | DRT | 0044 | [FlexGC_main.cpp:2825](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/gc/FlexGC_main.cpp#L2825) | WARN | - | | DRT | 0045 | [FlexGC_main.cpp:2959](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/gc/FlexGC_main.cpp#L2959) | WARN | - | | DRT | 0046 | [FlexGC_main.cpp:2966](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/gc/FlexGC_main.cpp#L2966) | WARN | - | | DRT | 0047 | [FlexGC_main.cpp:2973](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/gc/FlexGC_main.cpp#L2973) | WARN | - | | DRT | 0048 | [FlexGC_main.cpp:2980](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/gc/FlexGC_main.cpp#L2980) | WARN | - | | DRT | 0049 | [FlexDR_init.cpp:1631](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/dr/FlexDR_init.cpp#L1631) | ERROR | - | | DRT | 0050 | [FlexGC_main.cpp:2987](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/gc/FlexGC_main.cpp#L2987) | WARN | - | | DRT | 0051 | [FlexGC_main.cpp:2994](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/gc/FlexGC_main.cpp#L2994) | WARN | - | | DRT | 0052 | [FlexGC_main.cpp:3001](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/gc/FlexGC_main.cpp#L3001) | WARN | - | | DRT | 0053 | [FlexGC_init.cpp:1035](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/gc/FlexGC_init.cpp#L1035) | ERROR | - | | DRT | 0054 | [FlexGC_main.cpp:3091](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/gc/FlexGC_main.cpp#L3091) | WARN | - | | DRT | 0055 | [FlexGC_main.cpp:3096](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/gc/FlexGC_main.cpp#L3096) | WARN | - | | DRT | 0056 | [FlexGC_main.cpp:3104](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/gc/FlexGC_main.cpp#L3104) | WARN | - | | DRT | 0057 | [FlexGC_main.cpp:3112](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/gc/FlexGC_main.cpp#L3112) | WARN | - | | DRT | 0058 | [FlexGC_main.cpp:3117](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/gc/FlexGC_main.cpp#L3117) | WARN | - | | DRT | 0059 | [FlexGC_main.cpp:3122](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/gc/FlexGC_main.cpp#L3122) | WARN | - | | DRT | 0060 | [FlexGC_main.cpp:3128](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/gc/FlexGC_main.cpp#L3128) | WARN | - | | DRT | 0061 | [FlexGC_main.cpp:3135](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/gc/FlexGC_main.cpp#L3135) | WARN | - | | DRT | 0062 | [FlexGC_main.cpp:3140](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/gc/FlexGC_main.cpp#L3140) | WARN | - | | DRT | 0063 | [FlexGC_main.cpp:3145](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/gc/FlexGC_main.cpp#L3145) | WARN | - | | DRT | 0064 | [FlexDR_init.cpp:1645](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/dr/FlexDR_init.cpp#L1645) | ERROR | - | | DRT | 0065 | [FlexPA_unique.cpp:127](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA_unique.cpp#L127) | ERROR | - | | DRT | 0066 | [FlexPA_unique.cpp:137](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA_unique.cpp#L137) | WARN | - | | DRT | 0067 | [FlexPA_acc_point.cpp:1382](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA_acc_point.cpp#L1382) | ERROR | - | | DRT | 0068 | [FlexPA_acc_point.cpp:394](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA_acc_point.cpp#L394) | ERROR | - | | DRT | 0070 | [FlexPA_acc_point.cpp:608](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA_acc_point.cpp#L608) | ERROR | - | | DRT | 0073 | [FlexPA_acc_point.cpp:1510](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA_acc_point.cpp#L1510) | ERROR | - | | DRT | 0074 | [FlexPA_acc_point.cpp:1579](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA_acc_point.cpp#L1579) | ERROR | - | | DRT | 0076 | [FlexPA_acc_point.cpp:1549](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA_acc_point.cpp#L1549) | INFO | - | | DRT | 0078 | [FlexPA_acc_point.cpp:1590](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA_acc_point.cpp#L1590) | INFO | - | | DRT | 0079 | [FlexPA.cpp:325](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA.cpp#L325) | INFO | - | | DRT | 0081 | [FlexPA.cpp:335](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA.cpp#L335) | INFO | - | | DRT | 0082 | [FlexPA_row_pattern.cpp:222](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA_row_pattern.cpp#L222) | INFO | - | | DRT | 0084 | [FlexPA_row_pattern.cpp:233](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA_row_pattern.cpp#L233) | INFO | - | | DRT | 0085 | [FlexPA_row_pattern.cpp:348](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA_row_pattern.cpp#L348) | ERROR | - | | DRT | 0086 | [FlexPA_acc_pattern.cpp:133](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA_acc_pattern.cpp#L133) | ERROR | - | | DRT | 0087 | [FlexPA_acc_pattern.cpp:95](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA_acc_pattern.cpp#L95) | WARN | - | | DRT | 0089 | [FlexPA_acc_pattern.cpp:336](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA_acc_pattern.cpp#L336) | WARN | - | | DRT | 0090 | [FlexPA_acc_pattern.cpp:574](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA_acc_pattern.cpp#L574) | ERROR | - | | DRT | 0091 | [FlexPA_acc_pattern.cpp:672](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA_acc_pattern.cpp#L672) | ERROR | - | | DRT | 0092 | [FlexRP_prep.cpp:1520](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/rp/FlexRP_prep.cpp#L1520) | WARN | - | | DRT | 0093 | [FlexRP_prep.cpp:1540](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/rp/FlexRP_prep.cpp#L1540) | WARN | - | | DRT | 0094 | [io.cpp:97](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L97) | ERROR | - | | DRT | 0095 | [io.cpp:162](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L162) | ERROR | - | | DRT | 0096 | [io.cpp:167](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L167) | ERROR | - | | DRT | 0097 | [io.cpp:223](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L223) | ERROR | - | | DRT | 0098 | [io.cpp:234](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L234) | ERROR | - | | DRT | 0099 | [io.cpp:256](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L256) | ERROR | - | | DRT | 0100 | [io.cpp:384](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L384) | ERROR | - | | DRT | 0101 | [io.cpp:387](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L387) | ERROR | - | | DRT | 0102 | [io.cpp:563](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L563) | ERROR | - | | DRT | 0103 | [io.cpp:593](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L593) | ERROR | - | | DRT | 0104 | [io.cpp:618](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L618) | ERROR | - | | DRT | 0105 | [io.cpp:637](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L637) | ERROR | - | | DRT | 0106 | [io.cpp:644](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L644) | ERROR | - | | DRT | 0107 | [io.cpp:768](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L768) | ERROR | - | | DRT | 0108 | [io.cpp:922](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L922) | ERROR | - | | DRT | 0109 | [io.cpp:1004](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L1004) | ERROR | - | | DRT | 0110 | [FlexPA_row_pattern.cpp:184](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA_row_pattern.cpp#L184) | INFO | - | | DRT | 0112 | [io.cpp:1189](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L1189) | ERROR | - | | DRT | 0113 | [io.cpp:3610](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L3610) | ERROR | - | | DRT | 0114 | [io.cpp:3747](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L3747) | ERROR | - | | DRT | 0115 | [FlexPA_graphics.cpp:53](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA_graphics.cpp#L53) | INFO | - | | DRT | 0116 | [io.cpp:1358](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L1358) | ERROR | - | | DRT | 0117 | [io.cpp:1362](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L1362) | ERROR | - | | DRT | 0118 | [TritonRoute.tcl:248](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/TritonRoute.tcl#L248) | ERROR | - | | DRT | 0119 | [FlexPA_graphics.cpp:269](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA_graphics.cpp#L269) | INFO | - | | DRT | 0120 | [io.cpp:655](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L655) | WARN | - | | DRT | 0122 | [io.cpp:2766](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L2766) | WARN | - | | DRT | 0123 | [io.cpp:2800](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L2800) | WARN | - | | DRT | 0124 | [io.cpp:3045](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L3045) | WARN | - | | DRT | 0125 | [io.cpp:3069](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L3069) | ERROR | - | | DRT | 0126 | [io.cpp:3077](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L3077) | ERROR | - | | DRT | 0127 | [io.cpp:3088](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L3088) | ERROR | - | | DRT | 0128 | [io.cpp:2910](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L2910) | ERROR | - | | DRT | 0129 | [io.cpp:2931](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L2931) | ERROR | - | | DRT | 0130 | [io.cpp:2945](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L2945) | ERROR | - | | DRT | 0131 | [io.cpp:2967](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L2967) | WARN | - | | DRT | 0132 | [io.cpp:2988](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L2988) | WARN | - | | DRT | 0133 | [io.cpp:2998](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L2998) | WARN | - | | DRT | 0134 | [io.cpp:3013](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L3013) | WARN | - | | DRT | 0135 | [io.cpp:3023](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L3023) | WARN | - | | DRT | 0136 | [io.cpp:3143](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L3143) | ERROR | - | | DRT | 0139 | [io.cpp:2303](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L2303) | WARN | - | | DRT | 0140 | [FlexTA_init.cpp:906](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/ta/FlexTA_init.cpp#L906) | ERROR | - | | DRT | 0141 | [io.cpp:2344](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L2344) | WARN | - | | DRT | 0142 | [io.cpp:2346](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L2346) | WARN | - | | DRT | 0143 | [io.cpp:2348](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L2348) | WARN | - | | DRT | 0144 | [FlexTA_init.cpp:944](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/ta/FlexTA_init.cpp#L944) | ERROR | - | | DRT | 0146 | [FlexPA_unique.cpp:177](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA_unique.cpp#L177) | ERROR | - | | DRT | 0147 | [io.cpp:2602](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L2602) | WARN | - | | DRT | 0148 | [io.cpp:2143](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L2143) | ERROR | - | | DRT | 0149 | [io.cpp:3137](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L3137) | INFO | - | | DRT | 0150 | [io.cpp:1353](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L1353) | INFO | - | | DRT | 0151 | [TritonRoute.cpp:587](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/TritonRoute.cpp#L587) | ERROR | - | | DRT | 0152 | [FlexDR.cpp:243](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/dr/FlexDR.cpp#L243) | ERROR | - | | DRT | 0153 | [GuideProcessor.cpp:709](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/GuideProcessor.cpp#L709) | ERROR | - | | DRT | 0154 | [GuideProcessor.cpp:634](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/GuideProcessor.cpp#L634) | ERROR | - | | DRT | 0155 | [GuideProcessor.cpp:662](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/GuideProcessor.cpp#L662) | ERROR | - | | DRT | 0156 | [GuideProcessor.cpp:380](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/GuideProcessor.cpp#L380) | INFO | - | | DRT | 0157 | [GuideProcessor.cpp:729](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/GuideProcessor.cpp#L729) | INFO | - | | DRT | 0158 | [FlexPA_graphics.cpp:170](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA_graphics.cpp#L170) | ERROR | - | | DRT | 0160 | [io_parser_helper.cpp:162](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io_parser_helper.cpp#L162) | WARN | - | | DRT | 0161 | [io.cpp:1914](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L1914) | WARN | - | | DRT | 0162 | [io_pin.cpp:21](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io_pin.cpp#L21) | INFO | - | | DRT | 0163 | [io_pin.cpp:66](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io_pin.cpp#L66) | INFO | - | | DRT | 0164 | [io_pin.cpp:119](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io_pin.cpp#L119) | INFO | - | | DRT | 0165 | [FlexPA.cpp:456](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA.cpp#L456) | INFO | - | | DRT | 0166 | [FlexPA.cpp:498](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA.cpp#L498) | INFO | - | | DRT | 0167 | [frTechObject.h:249](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/db/tech/frTechObject.h#L249) | INFO | - | | DRT | 0168 | [io_parser_helper.cpp:944](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io_parser_helper.cpp#L944) | INFO | - | | DRT | 0169 | [GuideProcessor.cpp:1983](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/GuideProcessor.cpp#L1983) | INFO | - | | DRT | 0170 | [GuideProcessor.cpp:788](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/GuideProcessor.cpp#L788) | ERROR | - | | DRT | 0171 | [GuideProcessor.cpp:793](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/GuideProcessor.cpp#L793) | ERROR | - | | DRT | 0172 | [GuideProcessor.cpp:843](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/GuideProcessor.cpp#L843) | ERROR | - | | DRT | 0173 | [GuideProcessor.cpp:848](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/GuideProcessor.cpp#L848) | ERROR | - | | DRT | 0174 | [GuideProcessor.cpp:867](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/GuideProcessor.cpp#L867) | ERROR | - | | DRT | 0175 | [GuideProcessor.cpp:876](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/GuideProcessor.cpp#L876) | ERROR | - | | DRT | 0176 | [GuideProcessor.cpp:888](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/GuideProcessor.cpp#L888) | INFO | - | | DRT | 0177 | [GuideProcessor.cpp:894](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/GuideProcessor.cpp#L894) | INFO | - | | DRT | 0178 | [GuideProcessor.cpp:2039](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/GuideProcessor.cpp#L2039) | INFO | - | | DRT | 0179 | [GuideProcessor.cpp:2042](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/GuideProcessor.cpp#L2042) | INFO | - | | DRT | 0180 | [io.cpp:3581](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L3581) | INFO | - | | DRT | 0181 | [FlexTA.cpp:323](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/ta/FlexTA.cpp#L323) | INFO | - | | DRT | 0182 | [FlexTA.cpp:336](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/ta/FlexTA.cpp#L336) | INFO | - | | DRT | 0183 | [FlexTA.cpp:216](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/ta/FlexTA.cpp#L216) | INFO | - | | DRT | 0184 | [FlexTA.cpp:234](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/ta/FlexTA.cpp#L234) | INFO | - | | DRT | 0185 | [taTest.cpp:43](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/test/taTest.cpp#L43) | ERROR | - | | DRT | 0186 | [FlexTA.cpp:300](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/ta/FlexTA.cpp#L300) | INFO | - | | DRT | 0187 | [FlexDR.cpp:467](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/dr/FlexDR.cpp#L467) | INFO | - | | DRT | 0188 | [taTest.cpp:46](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/test/taTest.cpp#L46) | ERROR | - | | DRT | 0190 | [io.cpp:241](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L241) | WARN | - | | DRT | 0191 | [io.cpp:262](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L262) | WARN | - | | DRT | 0192 | [io.cpp:3054](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L3054) | WARN | - | | DRT | 0193 | [io.cpp:2739](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L2739) | WARN | - | | DRT | 0194 | [FlexDR.cpp:481](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/dr/FlexDR.cpp#L481) | INFO | - | | DRT | 0195 | [FlexDR.cpp:629](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/dr/FlexDR.cpp#L629) | INFO | - | | DRT | 0198 | [FlexDR.cpp:1428](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/dr/FlexDR.cpp#L1428) | INFO | - | | DRT | 0199 | [FlexDR.cpp:652](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/dr/FlexDR.cpp#L652) | INFO | - | | DRT | 0200 | [FlexDR.cpp:1369](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/dr/FlexDR.cpp#L1369) | INFO | - | | DRT | 0204 | [io.cpp:4123](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L4123) | WARN | - | | DRT | 0206 | [FlexDR_conn.cpp:1364](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/dr/FlexDR_conn.cpp#L1364) | ERROR | - | | DRT | 0207 | [FlexDR_graphics.cpp:752](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/dr/FlexDR_graphics.cpp#L752) | INFO | - | | DRT | 0210 | [io.cpp:2215](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L2215) | WARN | - | | DRT | 0214 | [GuideProcessor.cpp:1421](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/GuideProcessor.cpp#L1421) | WARN | - | | DRT | 0215 | [GuideProcessor.cpp:1434](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/GuideProcessor.cpp#L1434) | WARN | - | | DRT | 0216 | [GuideProcessor.cpp:1443](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/GuideProcessor.cpp#L1443) | WARN | - | | DRT | 0217 | [GuideProcessor.cpp:1448](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/GuideProcessor.cpp#L1448) | WARN | - | | DRT | 0218 | [GuideProcessor.cpp:1471](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/GuideProcessor.cpp#L1471) | ERROR | - | | DRT | 0220 | [GuideProcessor.cpp:1559](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/GuideProcessor.cpp#L1559) | WARN | - | | DRT | 0222 | [GuideProcessor.cpp:1697](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/GuideProcessor.cpp#L1697) | ERROR | - | | DRT | 0223 | [GuideProcessor.cpp:1613](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/GuideProcessor.cpp#L1613) | ERROR | - | | DRT | 0226 | [FlexGC_eol.cpp:480](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/gc/FlexGC_eol.cpp#L480) | ERROR | - | | DRT | 0227 | [FlexDR.cpp:1779](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/dr/FlexDR.cpp#L1779) | INFO | - | | DRT | 0228 | [GuideProcessor.cpp:594](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/GuideProcessor.cpp#L594) | ERROR | - | | DRT | 0229 | [GuideProcessor.cpp:1233](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/GuideProcessor.cpp#L1233) | ERROR | - | | DRT | 0233 | [io_parser_helper.cpp:124](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io_parser_helper.cpp#L124) | ERROR | - | | DRT | 0234 | [io_parser_helper.cpp:115](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io_parser_helper.cpp#L115) | ERROR | - | | DRT | 0235 | [io_parser_helper.cpp:364](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io_parser_helper.cpp#L364) | WARN | - | | DRT | 0236 | [io_parser_helper.cpp:370](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io_parser_helper.cpp#L370) | INFO | - | | DRT | 0237 | [io_parser_helper.cpp:388](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io_parser_helper.cpp#L388) | WARN | - | | DRT | 0238 | [io_parser_helper.cpp:394](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io_parser_helper.cpp#L394) | INFO | - | | DRT | 0239 | [io_parser_helper.cpp:464](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io_parser_helper.cpp#L464) | ERROR | - | | DRT | 0240 | [io.cpp:1839](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L1839) | WARN | - | | DRT | 0241 | [io.cpp:2576](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L2576) | WARN | - | | DRT | 0242 | [io_parser_helper.cpp:472](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io_parser_helper.cpp#L472) | ERROR | - | | DRT | 0243 | [io_parser_helper.cpp:483](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io_parser_helper.cpp#L483) | ERROR | - | | DRT | 0244 | [io_parser_helper.cpp:421](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io_parser_helper.cpp#L421) | WARN | - | | DRT | 0245 | [GuideProcessor.cpp:2050](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/GuideProcessor.cpp#L2050) | INFO | - | | DRT | 0247 | [io.cpp:3275](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L3275) | WARN | - | | DRT | 0248 | [io_pin.cpp:55](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io_pin.cpp#L55) | WARN | - | | DRT | 0249 | [FlexDR_graphics.cpp:673](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/dr/FlexDR_graphics.cpp#L673) | INFO | - | | DRT | 0250 | [FlexDR_graphics.cpp:676](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/dr/FlexDR_graphics.cpp#L676) | INFO | - | | DRT | 0251 | [io_parser_helper.cpp:437](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io_parser_helper.cpp#L437) | WARN | - | | DRT | 0253 | [FlexGC_init.cpp:181](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/gc/FlexGC_init.cpp#L181) | ERROR | - | | DRT | 0255 | [FlexDR_maze.cpp:1956](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/dr/FlexDR_maze.cpp#L1956) | ERROR | - | | DRT | 0256 | [io.cpp:435](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L435) | WARN | - | | DRT | 0257 | [FlexPA_acc_point.cpp:210](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA_acc_point.cpp#L210) | ERROR | - | | DRT | 0258 | [io.cpp:1907](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L1907) | WARN | - | | DRT | 0259 | [io.cpp:1921](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L1921) | WARN | - | | DRT | 0261 | [io.cpp:1942](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L1942) | WARN | - | | DRT | 0262 | [io.cpp:1949](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L1949) | WARN | - | | DRT | 0263 | [io.cpp:1956](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L1956) | WARN | - | | DRT | 0267 | [frTime.cpp:31](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/db/infra/frTime.cpp#L31) | INFO | - | | DRT | 0268 | [FlexTA.cpp:282](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/ta/FlexTA.cpp#L282) | INFO | - | | DRT | 0269 | [FlexGC_eol.cpp:51](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/gc/FlexGC_eol.cpp#L51) | ERROR | - | | DRT | 0270 | [FlexGC_eol.cpp:230](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/gc/FlexGC_eol.cpp#L230) | ERROR | - | | DRT | 0271 | [FlexGC_eol.cpp:402](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/gc/FlexGC_eol.cpp#L402) | ERROR | - | | DRT | 0272 | [io.cpp:3160](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L3160) | WARN | - | | DRT | 0273 | [io.cpp:3174](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L3174) | WARN | - | | DRT | 0275 | [FlexDR_graphics.cpp:679](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/dr/FlexDR_graphics.cpp#L679) | INFO | - | | DRT | 0276 | [FlexPA_row_pattern.cpp:441](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA_row_pattern.cpp#L441) | ERROR | - | | DRT | 0277 | [FlexPA_acc_pattern.cpp:744](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA_acc_pattern.cpp#L744) | ERROR | - | | DRT | 0278 | [FlexPA_acc_pattern.cpp:779](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA_acc_pattern.cpp#L779) | ERROR | - | | DRT | 0279 | [io.cpp:1968](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L1968) | WARN | - | | DRT | 0280 | [FlexPA_graphics.cpp:342](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA_graphics.cpp#L342) | WARN | - | | DRT | 0281 | [FlexPA_graphics.cpp:348](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA_graphics.cpp#L348) | INFO | - | | DRT | 0282 | [io.cpp:179](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L179) | WARN | - | | DRT | 0290 | [TritonRoute.cpp:1520](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/TritonRoute.cpp#L1520) | WARN | - | | DRT | 0291 | [TritonRoute.cpp:1506](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/TritonRoute.cpp#L1506) | ERROR | - | | DRT | 0292 | [FlexPA_graphics.cpp:304](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA_graphics.cpp#L304) | INFO | - | | DRT | 0293 | [FlexPA_graphics.cpp:61](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA_graphics.cpp#L61) | ERROR | - | | DRT | 0294 | [io.cpp:3836](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L3836) | ERROR | - | | DRT | 0295 | [io.cpp:3844](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L3844) | ERROR | - | | DRT | 0296 | [io.cpp:3848](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L3848) | ERROR | - | | DRT | 0297 | [io.cpp:3876](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L3876) | ERROR | - | | DRT | 0298 | [io.cpp:3884](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L3884) | ERROR | - | | DRT | 0299 | [io.cpp:3893](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L3893) | ERROR | - | | DRT | 0300 | [io.cpp:3906](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L3906) | ERROR | - | | DRT | 0301 | [io.cpp:3922](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L3922) | ERROR | - | | DRT | 0302 | [io.cpp:1146](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L1146) | ERROR | - | | DRT | 0303 | [io.cpp:3931](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L3931) | ERROR | - | | DRT | 0304 | [TritonRoute.cpp:975](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/TritonRoute.cpp#L975) | ERROR | - | | DRT | 0305 | [io.cpp:1035](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L1035) | ERROR | - | | DRT | 0306 | [io.cpp:607](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L607) | ERROR | - | | DRT | 0307 | [io.cpp:626](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L626) | ERROR | - | | DRT | 0308 | [TritonRoute.tcl:461](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/TritonRoute.tcl#L461) | ERROR | - | | DRT | 0309 | [io.cpp:666](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L666) | ERROR | - | | DRT | 0310 | [io.cpp:721](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L721) | ERROR | - | | DRT | 0311 | [FlexGC_main.cpp:2163](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/gc/FlexGC_main.cpp#L2163) | WARN | - | | DRT | 0312 | [FlexGC_main.cpp:2170](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/gc/FlexGC_main.cpp#L2170) | WARN | - | | DRT | 0313 | [FlexGC_main.cpp:2175](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/gc/FlexGC_main.cpp#L2175) | WARN | - | | DRT | 0314 | [FlexGC_main.cpp:2178](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/gc/FlexGC_main.cpp#L2178) | WARN | - | | DRT | 0315 | [FlexGC_main.cpp:2181](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/gc/FlexGC_main.cpp#L2181) | WARN | - | | DRT | 0316 | [FlexGC_main.cpp:2184](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/gc/FlexGC_main.cpp#L2184) | WARN | - | | DRT | 0317 | [io.cpp:2488](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L2488) | WARN | - | | DRT | 0318 | [io.cpp:2496](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L2496) | WARN | - | | DRT | 0319 | [io.cpp:2504](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L2504) | WARN | - | | DRT | 0320 | [FlexPA_unique.cpp:264](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA_unique.cpp#L264) | ERROR | - | | DRT | 0321 | [FlexPA_unique.cpp:274](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA_unique.cpp#L274) | ERROR | - | | DRT | 0322 | [FlexPA_unique.cpp:282](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA_unique.cpp#L282) | ERROR | - | | DRT | 0324 | [io.cpp:2010](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L2010) | WARN | - | | DRT | 0325 | [io.cpp:2018](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L2018) | WARN | - | | DRT | 0326 | [io.cpp:2026](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L2026) | WARN | - | | DRT | 0327 | [io.cpp:2034](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L2034) | WARN | - | | DRT | 0328 | [io.cpp:2042](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L2042) | WARN | - | | DRT | 0329 | [FlexPA_row_pattern.cpp:166](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA_row_pattern.cpp#L166) | ERROR | - | | DRT | 0330 | [FlexPA.cpp:351](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA.cpp#L351) | ERROR | - | | DRT | 0331 | [FlexPA.cpp:283](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA.cpp#L283) | ERROR | - | | DRT | 0332 | [FlexPA_row_pattern.cpp:208](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA_row_pattern.cpp#L208) | ERROR | - | | DRT | 0333 | [io.cpp:1620](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L1620) | WARN | - | | DRT | 0334 | [io.cpp:1625](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L1625) | WARN | - | | DRT | 0335 | [io.cpp:1657](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L1657) | WARN | - | | DRT | 0336 | [io_parser_helper.cpp:208](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io_parser_helper.cpp#L208) | ERROR | - | | DRT | 0337 | [io.cpp:357](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L357) | ERROR | - | | DRT | 0338 | [io.cpp:416](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L416) | ERROR | - | | DRT | 0339 | [io.cpp:3128](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L3128) | ERROR | - | | DRT | 0340 | [io.cpp:2058](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L2058) | WARN | - | | DRT | 0341 | [io.cpp:2066](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L2066) | WARN | - | | DRT | 0342 | [io.cpp:2074](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L2074) | WARN | - | | DRT | 0343 | [io.cpp:2082](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L2082) | WARN | - | | DRT | 0344 | [io.cpp:2090](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L2090) | WARN | - | | DRT | 0345 | [io.cpp:2098](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L2098) | WARN | - | | DRT | 0346 | [io.cpp:2106](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L2106) | WARN | - | | DRT | 0347 | [io.cpp:2114](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L2114) | WARN | - | | DRT | 0348 | [io.cpp:2122](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L2122) | WARN | - | | DRT | 0349 | [io.cpp:2130](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L2130) | WARN | - | | DRT | 0350 | [io.cpp:2153](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L2153) | WARN | - | | DRT | 0352 | [GuideProcessor.cpp:713](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/GuideProcessor.cpp#L713) | ERROR | - | | DRT | 0400 | [io.cpp:1503](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L1503) | WARN | - | | DRT | 0401 | [io.cpp:1511](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L1511) | WARN | - | | DRT | 0403 | [io.cpp:1519](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L1519) | WARN | - | | DRT | 0404 | [io.cpp:1279](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L1279) | ERROR | - | | DRT | 0405 | [io.cpp:1283](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L1283) | ERROR | - | | DRT | 0406 | [FlexTA_assign.cpp:613](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/ta/FlexTA_assign.cpp#L613) | ERROR | - | | DRT | 0407 | [FlexDR_maze.cpp:1684](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/dr/FlexDR_maze.cpp#L1684) | ERROR | - | | DRT | 0410 | [FlexGC_main.cpp:2307](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/gc/FlexGC_main.cpp#L2307) | ERROR | - | | DRT | 0411 | [FlexGC_main.cpp:2312](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/gc/FlexGC_main.cpp#L2312) | ERROR | - | | DRT | 0412 | [FlexTA_assign.cpp:790](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/ta/FlexTA_assign.cpp#L790) | ERROR | - | | DRT | 0415 | [io.cpp:4157](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L4157) | ERROR | - | | DRT | 0416 | [io_parser_helper.cpp:777](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io_parser_helper.cpp#L777) | ERROR | - | | DRT | 0417 | [io_parser_helper.cpp:819](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io_parser_helper.cpp#L819) | ERROR | - | | DRT | 0418 | [io_parser_helper.cpp:919](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io_parser_helper.cpp#L919) | WARN | - | | DRT | 0419 | [io_parser_helper.cpp:922](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io_parser_helper.cpp#L922) | WARN | - | | DRT | 0421 | [io_parser_helper.cpp:881](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io_parser_helper.cpp#L881) | WARN | - | | DRT | 0422 | [io_parser_helper.cpp:884](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io_parser_helper.cpp#L884) | WARN | - | | DRT | 0423 | [FlexDR_maze.cpp:2313](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/dr/FlexDR_maze.cpp#L2313) | ERROR | - | | DRT | 0500 | [FlexDR.cpp:2075](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/dr/FlexDR.cpp#L2075) | ERROR | - | | DRT | 0506 | [TritonRoute.tcl:139](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/TritonRoute.tcl#L139) | ERROR | - | | DRT | 0507 | [TritonRoute.tcl:144](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/TritonRoute.tcl#L144) | ERROR | - | | DRT | 0508 | [TritonRoute.tcl:149](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/TritonRoute.tcl#L149) | ERROR | - | | DRT | 0509 | [TritonRoute.tcl:122](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/TritonRoute.tcl#L122) | ERROR | - | | DRT | 0510 | [TritonRoute.tcl:126](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/TritonRoute.tcl#L126) | ERROR | - | | DRT | 0511 | [TritonRoute.tcl:294](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/TritonRoute.tcl#L294) | ERROR | - | | DRT | 0512 | [frRegionQuery.cpp:302](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/frRegionQuery.cpp#L302) | ERROR | - | | DRT | 0513 | [frRegionQuery.cpp:229](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/frRegionQuery.cpp#L229) | ERROR | - | | DRT | 0514 | [TritonRoute.tcl:298](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/TritonRoute.tcl#L298) | ERROR | - | | DRT | 0516 | [TritonRoute.tcl:154](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/TritonRoute.tcl#L154) | ERROR | - | | DRT | 0517 | [TritonRoute.tcl:370](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/TritonRoute.tcl#L370) | ERROR | - | | DRT | 0519 | [FlexPA_acc_point.cpp:765](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA_acc_point.cpp#L765) | WARN | - | | DRT | 0520 | [TritonRoute.tcl:376](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/TritonRoute.tcl#L376) | ERROR | - | | DRT | 0550 | [FlexGridGraph.h:1216](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/dr/FlexGridGraph.h#L1216) | ERROR | - | | DRT | 0551 | [FlexGridGraph.h:1228](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/dr/FlexGridGraph.h#L1228) | ERROR | - | | DRT | 0552 | [TritonRoute.tcl:332](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/TritonRoute.tcl#L332) | ERROR | - | | DRT | 0553 | [TritonRoute.tcl:337](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/TritonRoute.tcl#L337) | ERROR | - | | DRT | 0554 | [TritonRoute.tcl:342](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/TritonRoute.tcl#L342) | ERROR | - | | DRT | 0555 | [TritonRoute.tcl:347](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/TritonRoute.tcl#L347) | ERROR | - | | DRT | 0606 | [TritonRoute.cpp:604](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/TritonRoute.cpp#L604) | WARN | - | | DRT | 0607 | [TritonRoute.cpp:616](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/TritonRoute.cpp#L616) | WARN | - | | DRT | 0608 | [io_parser_helper.cpp:73](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io_parser_helper.cpp#L73) | ERROR | - | | DRT | 0609 | [TritonRoute.cpp:628](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/TritonRoute.cpp#L628) | WARN | - | | DRT | 0610 | [TritonRoute.cpp:1264](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/TritonRoute.cpp#L1264) | ERROR | - | | DRT | 0611 | [TritonRoute.cpp:1270](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/TritonRoute.cpp#L1270) | ERROR | - | | DRT | 0612 | [TritonRoute.tcl:481](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/TritonRoute.tcl#L481) | ERROR | - | | DRT | 0613 | [TritonRoute.tcl:492](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/TritonRoute.tcl#L492) | ERROR | - | | DRT | 0615 | [TritonRoute.cpp:1279](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/TritonRoute.cpp#L1279) | ERROR | - | | DRT | 0616 | [TritonRoute.cpp:1284](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/TritonRoute.cpp#L1284) | ERROR | - | | DRT | 0617 | [TritonRoute.cpp:640](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/TritonRoute.cpp#L640) | WARN | - | | DRT | 0618 | [TritonRoute.cpp:1287](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/TritonRoute.cpp#L1287) | ERROR | - | | DRT | 0619 | [io.cpp:1702](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L1702) | WARN | - | | DRT | 0620 | [io.cpp:1710](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L1710) | WARN | - | | DRT | 0621 | [io.cpp:1718](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L1718) | WARN | - | | DRT | 0622 | [io.cpp:1726](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L1726) | WARN | - | | DRT | 0623 | [TritonRoute.cpp:989](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/TritonRoute.cpp#L989) | ERROR | - | | DRT | 0624 | [fixture.cpp:747](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/test/fixture.cpp#L747) | ERROR | - | | DRT | 0625 | [io.cpp:1765](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L1765) | WARN | - | | DRT | 0626 | [TritonRoute.cpp:1065](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/TritonRoute.cpp#L1065) | ERROR | - | | DRT | 0999 | [FlexDR.cpp:2104](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/dr/FlexDR.cpp#L2104) | ERROR | - | | DRT | 1006 | [FlexDR_maze.cpp:1995](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/dr/FlexDR_maze.cpp#L1995) | ERROR | - | | DRT | 1007 | [GuideProcessor.cpp:986](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/GuideProcessor.cpp#L986) | ERROR | - | | DRT | 1009 | [FlexDR_init.cpp:1238](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/dr/FlexDR_init.cpp#L1238) | ERROR | - | | DRT | 1010 | [FlexDR_init.cpp:110](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/dr/FlexDR_init.cpp#L110) | ERROR | - | | DRT | 1011 | [io.cpp:1327](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/io/io.cpp#L1327) | ERROR | - | | DRT | 12304 | [TritonRoute.cpp:894](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/TritonRoute.cpp#L894) | ERROR | - | | DRT | 1231 | [FlexDR_init.cpp:1306](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/dr/FlexDR_init.cpp#L1306) | ERROR | - | | DRT | 2000 | [FlexDR_maze.cpp:2343](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/dr/FlexDR_maze.cpp#L2343) | INFO | - | | DRT | 2001 | [FlexDR_maze.cpp:1733](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/dr/FlexDR_maze.cpp#L1733) | INFO | - | | DRT | 2002 | [FlexDR_maze.cpp:1934](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/dr/FlexDR_maze.cpp#L1934) | INFO | - | | DRT | 2003 | [FlexDR_maze.cpp:1982](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/dr/FlexDR_maze.cpp#L1982) | INFO | - | | DRT | 2005 | [FlexDR_maze.cpp:2224](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/dr/FlexDR_maze.cpp#L2224) | INFO | - | | DRT | 2006 | [FlexDR_maze.cpp:2228](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/dr/FlexDR_maze.cpp#L2228) | INFO | - | | DRT | 2007 | [FlexDR_maze.cpp:2262](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/dr/FlexDR_maze.cpp#L2262) | INFO | - | | DRT | 2008 | [TritonRoute.tcl:236](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/TritonRoute.tcl#L236) | ERROR | - | | DRT | 4000 | [FlexPA_graphics.cpp:66](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA_graphics.cpp#L66) | INFO | - | | DRT | 4500 | [FlexGC_main.cpp:2282](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/gc/FlexGC_main.cpp#L2282) | ERROR | - | | DRT | 4501 | [FlexGC_main.cpp:2295](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/gc/FlexGC_main.cpp#L2295) | ERROR | - | | DRT | 5000 | [FlexPA_graphics.cpp:73](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA_graphics.cpp#L73) | WARN | - | | DRT | 6000 | [FlexPA_acc_point.cpp:575](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA_acc_point.cpp#L575) | WARN | - | | DRT | 6001 | [FlexDR_conn.cpp:1063](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/dr/FlexDR_conn.cpp#L1063) | WARN | - | | DRT | 7461 | [FlexDR.cpp:2051](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/dr/FlexDR.cpp#L2051) | ERROR | - | | DRT | 9199 | [TritonRoute.cpp:534](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/TritonRoute.cpp#L534) | ERROR | - | | DRT | 9419 | [FlexPA_row_pattern.cpp:104](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/pa/FlexPA_row_pattern.cpp#L104) | ERROR | - | | DRT | 9504 | [TritonRoute.cpp:928](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/TritonRoute.cpp#L928) | ERROR | - | | DRT | 9947 | [TritonRoute.cpp:347](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/TritonRoute.cpp#L347) | ERROR | - | | DRT | 9954 | [TritonRoute.cpp:358](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/TritonRoute.cpp#L358) | ERROR | - | | DRT | 9999 | [TritonRoute.cpp:470](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/drt/src/TritonRoute.cpp#L470) | ERROR | - | | DST | 0001 | [Distributed.cc:58](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dst/src/Distributed.cc#L58) | ERROR | - | | DST | 0002 | [Distributed.tcl:17](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dst/src/Distributed.tcl#L17) | ERROR | - | | DST | 0003 | [Distributed.tcl:22](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dst/src/Distributed.tcl#L22) | ERROR | - | | DST | 0004 | [WorkerConnection.cc:100](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dst/src/WorkerConnection.cc#L100) | WARN | - | | DST | 0005 | [WorkerConnection.cc:90](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dst/src/WorkerConnection.cc#L90) | WARN | - | | DST | 0006 | [BalancerConnection.cc:83](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dst/src/BalancerConnection.cc#L83) | WARN | - | | DST | 0007 | [LoadBalancer.cc:29](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dst/src/LoadBalancer.cc#L29) | INFO | - | | DST | 0008 | [BalancerConnection.cc:213](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dst/src/BalancerConnection.cc#L213) | WARN | - | | DST | 0009 | [Distributed.cc:76](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dst/src/Distributed.cc#L76) | ERROR | - | | DST | 0010 | [Distributed.tcl:41](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dst/src/Distributed.tcl#L41) | ERROR | - | | DST | 0011 | [Distributed.tcl:46](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dst/src/Distributed.tcl#L46) | ERROR | - | | DST | 0012 | [Distributed.cc:204](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dst/src/Distributed.cc#L204) | WARN | - | | DST | 0013 | [Distributed.cc:214](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dst/src/Distributed.cc#L214) | WARN | - | | DST | 0014 | [Distributed.cc:258](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dst/src/Distributed.cc#L258) | WARN | - | | DST | 0016 | [Distributed.tcl:66](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dst/src/Distributed.tcl#L66) | ERROR | - | | DST | 0017 | [Distributed.tcl:71](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dst/src/Distributed.tcl#L71) | ERROR | - | | DST | 0020 | [Distributed.cc:267](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dst/src/Distributed.cc#L267) | WARN | - | | DST | 0022 | [Distributed.cc:277](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dst/src/Distributed.cc#L277) | WARN | - | | DST | 0041 | [WorkerConnection.cc:56](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dst/src/WorkerConnection.cc#L56) | WARN | - | | DST | 0042 | [BalancerConnection.cc:68](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dst/src/BalancerConnection.cc#L68) | WARN | - | | DST | 0112 | [Distributed.cc:134](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dst/src/Distributed.cc#L134) | WARN | - | | DST | 0113 | [Distributed.cc:144](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dst/src/Distributed.cc#L144) | WARN | - | | DST | 0114 | [Distributed.cc:179](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dst/src/Distributed.cc#L179) | WARN | - | | DST | 0203 | [LoadBalancer.cc:180](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dst/src/LoadBalancer.cc#L180) | WARN | - | | DST | 0204 | [BalancerConnection.cc:118](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dst/src/BalancerConnection.cc#L118) | WARN | - | | DST | 0205 | [BalancerConnection.cc:128](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dst/src/BalancerConnection.cc#L128) | WARN | - | | DST | 0207 | [BalancerConnection.cc:191](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dst/src/BalancerConnection.cc#L191) | WARN | - | | DST | 9999 | [Distributed.cc:244](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dst/src/Distributed.cc#L244) | ERROR | - | | EST | 0001 | [EstimateParasitics.tcl:219](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/est/src/EstimateParasitics.tcl#L219) | ERROR | - | | EST | 0002 | [EstimateParasitics.tcl:237](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/est/src/EstimateParasitics.tcl#L237) | ERROR | - | | EST | 0003 | [EstimateParasitics.tcl:40](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/est/src/EstimateParasitics.tcl#L40) | ERROR | - | | EST | 0004 | [EstimateParasitics.cpp:105](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/est/src/EstimateParasitics.cpp#L105) | WARN | - | | EST | 0005 | [EstimateParasitics.tcl:37](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/est/src/EstimateParasitics.tcl#L37) | ERROR | - | | EST | 0006 | [EstimateParasitics.tcl:222](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/est/src/EstimateParasitics.tcl#L222) | ERROR | - | | EST | 0007 | [EstimateParasitics.i:269](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/est/src/EstimateParasitics.i#L269) | ERROR | - | | EST | 0010 | [EstimateParasitics.tcl:375](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/est/src/EstimateParasitics.tcl#L375) | WARN | - | | EST | 0011 | [EstimateParasitics.tcl:378](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/est/src/EstimateParasitics.tcl#L378) | WARN | - | | EST | 0012 | [EstimateParasitics.tcl:381](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/est/src/EstimateParasitics.tcl#L381) | WARN | - | | EST | 0013 | [EstimateParasitics.tcl:384](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/est/src/EstimateParasitics.tcl#L384) | WARN | - | | EST | 0015 | [EstimateParasitics.tcl:291](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/est/src/EstimateParasitics.tcl#L291) | ERROR | - | | EST | 0016 | [EstimateParasitics.tcl:277](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/est/src/EstimateParasitics.tcl#L277) | ERROR | - | | EST | 0017 | [EstimateParasitics.tcl:280](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/est/src/EstimateParasitics.tcl#L280) | ERROR | - | | EST | 0018 | [EstimateParasitics.tcl:408](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/est/src/EstimateParasitics.tcl#L408) | WARN | - | | EST | 0019 | [EstimateParasitics.i:101](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/est/src/EstimateParasitics.i#L101) | ERROR | - | | EST | 0025 | [MakeWireParasitics.cpp:241](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/est/src/MakeWireParasitics.cpp#L241) | WARN | - | | EST | 0026 | [MakeWireParasitics.cpp:349](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/est/src/MakeWireParasitics.cpp#L349) | WARN | - | | EST | 0027 | [EstimateParasitics.tcl:418](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/est/src/EstimateParasitics.tcl#L418) | WARN | - | | EST | 0092 | [SteinerTree.cpp:278](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/est/src/SteinerTree.cpp#L278) | ERROR | - | | EST | 0093 | [SteinerTree.cpp:207](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/est/src/SteinerTree.cpp#L207) | ERROR | - | | EST | 0104 | [EstimateParasitics.cpp:1388](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/est/src/EstimateParasitics.cpp#L1388) | ERROR | - | | EST | 0108 | [EstimateParasitics.cpp:1211](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/est/src/EstimateParasitics.cpp#L1211) | ERROR | - | | EST | 0109 | [EstimateParasitics.cpp:423](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/est/src/EstimateParasitics.cpp#L423) | ERROR | - | | EST | 0162 | [EstimateParasitics.cpp:356](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/est/src/EstimateParasitics.cpp#L356) | ERROR | - | | EST | 0163 | [EstimateParasitics.cpp:364](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/est/src/EstimateParasitics.cpp#L364) | ERROR | - | | EST | 0164 | [EstimateParasitics.cpp:895](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/est/src/EstimateParasitics.cpp#L895) | ERROR | - | | EST | 0165 | [EstimateParasitics.cpp:1428](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/est/src/EstimateParasitics.cpp#L1428) | WARN | - | | EST | 0166 | [EstimateParasitics.cpp:1431](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/est/src/EstimateParasitics.cpp#L1431) | WARN | - | | EST | 0201 | [EstimateParasitics.tcl:56](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/est/src/EstimateParasitics.tcl#L56) | ERROR | - | | EST | 0202 | [EstimateParasitics.tcl:65](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/est/src/EstimateParasitics.tcl#L65) | ERROR | - | | EST | 0203 | [EstimateParasitics.tcl:69](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/est/src/EstimateParasitics.tcl#L69) | ERROR | - | | EST | 0204 | [EstimateParasitics.tcl:73](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/est/src/EstimateParasitics.tcl#L73) | ERROR | - | | EST | 0205 | [EstimateParasitics.tcl:105](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/est/src/EstimateParasitics.tcl#L105) | ERROR | - | | EST | 0206 | [EstimateParasitics.tcl:109](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/est/src/EstimateParasitics.tcl#L109) | WARN | - | | EST | 0208 | [EstimateParasitics.tcl:127](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/est/src/EstimateParasitics.tcl#L127) | ERROR | - | | EST | 0209 | [EstimateParasitics.tcl:130](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/est/src/EstimateParasitics.tcl#L130) | ERROR | - | | EST | 0210 | [EstimateParasitics.tcl:8](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/est/src/EstimateParasitics.tcl#L8) | ERROR | - | | EST | 0350 | [MakeWireParasitics.cpp:459](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/est/src/MakeWireParasitics.cpp#L459) | WARN | - | | EXA | 0001 | [example.cpp:44](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/exa/src/example.cpp#L44) | INFO | - | | EXA | 0002 | [example.cpp:30](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/exa/src/example.cpp#L30) | ERROR | - | | EXA | 0003 | [example.cpp:35](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/exa/src/example.cpp#L35) | ERROR | - | | EXA | 0004 | [example.cpp:58](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/exa/src/example.cpp#L58) | ERROR | - | | FIN | 0001 | [DensityFill.cpp:172](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/fin/src/DensityFill.cpp#L172) | ERROR | - | | FIN | 0002 | [DensityFill.cpp:183](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/fin/src/DensityFill.cpp#L183) | ERROR | - | | FIN | 0003 | [DensityFill.cpp:443](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/fin/src/DensityFill.cpp#L443) | INFO | - | | FIN | 0004 | [DensityFill.cpp:481](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/fin/src/DensityFill.cpp#L481) | INFO | - | | FIN | 0005 | [DensityFill.cpp:500](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/fin/src/DensityFill.cpp#L500) | INFO | - | | FIN | 0006 | [DensityFill.cpp:506](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/fin/src/DensityFill.cpp#L506) | INFO | - | | FIN | 0007 | [finale.tcl:18](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/fin/src/finale.tcl#L18) | ERROR | - | | FIN | 0008 | [finale.tcl:24](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/fin/src/finale.tcl#L24) | ERROR | - | | FIN | 0009 | [DensityFill.cpp:468](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/fin/src/DensityFill.cpp#L468) | INFO | - | | FIN | 0010 | [DensityFill.cpp:526](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/fin/src/DensityFill.cpp#L526) | WARN | - | | FLW | 0001 | [logger_redirection.tcl:8](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/utl/test/logger_redirection.tcl#L8) | INFO | - | | FLW | 0002 | [logger_redirection.tcl:31](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/utl/test/logger_redirection.tcl#L31) | INFO | - | | FLW | 0003 | [tee.tcl:8](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/utl/test/tee.tcl#L8) | INFO | - | | FLW | 0004 | [tee.tcl:51](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/utl/test/tee.tcl#L51) | INFO | - | | FLW | 0005 | [tee.tcl:52](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/utl/test/tee.tcl#L52) | INFO | - | | FLW | 0006 | [tee.tcl:53](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/utl/test/tee.tcl#L53) | INFO | - | | FLW | 0007 | [tee.tcl:62](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/utl/test/tee.tcl#L62) | INFO | - | | FLW | 0008 | [tee.tcl:64](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/utl/test/tee.tcl#L64) | INFO | - | | FLW | 0009 | [tee.tcl:66](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/utl/test/tee.tcl#L66) | INFO | - | | GPL | 0001 | [placerBase.cpp:754](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/placerBase.cpp#L754) | INFO | - | | GPL | 0002 | [placerBase.cpp:755](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/placerBase.cpp#L755) | INFO | - | | GPL | 0003 | [placerBase.cpp:783](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/placerBase.cpp#L783) | INFO | - | | GPL | 0004 | [placerBase.cpp:789](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/placerBase.cpp#L789) | INFO | - | | GPL | 0005 | [initialPlace.cpp:52](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/initialPlace.cpp#L52) | INFO | - | | GPL | 0006 | [placerBase.cpp:1411](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/placerBase.cpp#L1411) | INFO | - | | GPL | 0007 | [placerBase.cpp:1415](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/placerBase.cpp#L1415) | INFO | - | | GPL | 0008 | [placerBase.cpp:1416](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/placerBase.cpp#L1416) | INFO | - | | GPL | 0009 | [placerBase.cpp:1417](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/placerBase.cpp#L1417) | INFO | - | | GPL | 0010 | [placerBase.cpp:1418](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/placerBase.cpp#L1418) | INFO | - | | GPL | 0011 | [placerBase.cpp:1422](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/placerBase.cpp#L1422) | INFO | - | | GPL | 0012 | [placerBase.cpp:1427](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/placerBase.cpp#L1427) | INFO | - | | GPL | 0013 | [placerBase.cpp:1435](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/placerBase.cpp#L1435) | INFO | - | | GPL | 0014 | [placerBase.cpp:1451](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/placerBase.cpp#L1451) | INFO | - | | GPL | 0015 | [placerBase.cpp:1455](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/placerBase.cpp#L1455) | INFO | - | | GPL | 0016 | [placerBase.cpp:1447](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/placerBase.cpp#L1447) | INFO | - | | GPL | 0017 | [placerBase.cpp:1459](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/placerBase.cpp#L1459) | INFO | - | | GPL | 0018 | [placerBase.cpp:1464](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/placerBase.cpp#L1464) | INFO | - | | GPL | 0019 | [placerBase.cpp:1468](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/placerBase.cpp#L1468) | INFO | - | | GPL | 0020 | [placerBase.cpp:1470](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/placerBase.cpp#L1470) | INFO | - | | GPL | 0021 | [placerBase.cpp:1475](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/placerBase.cpp#L1475) | INFO | - | | GPL | 0022 | [replace.cpp:391](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/replace.cpp#L391) | INFO | - | | GPL | 0023 | [nesterovBase.cpp:738](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L738) | INFO | - | | GPL | 0024 | [nesterovBase.cpp:739](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L739) | INFO | - | | GPL | 0025 | [nesterovBase.cpp:743](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L743) | INFO | - | | GPL | 0026 | [nesterovBase.cpp:747](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L747) | INFO | - | | GPL | 0027 | [nesterovBase.cpp:748](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L748) | INFO | - | | GPL | 0028 | [nesterovBase.cpp:781](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L781) | INFO | - | | GPL | 0029 | [nesterovBase.cpp:787](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L787) | INFO | - | | GPL | 0030 | [nesterovBase.cpp:820](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L820) | INFO | - | | GPL | 0031 | [nesterovBase.cpp:3053](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L3053) | INFO | - | | GPL | 0032 | [placerBase.cpp:1078](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/placerBase.cpp#L1078) | INFO | - | | GPL | 0033 | [nesterovBase.cpp:1959](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L1959) | INFO | - | | GPL | 0034 | [nesterovBase.cpp:808](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L808) | WARN | - | | GPL | 0035 | [placerBase.cpp:908](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/placerBase.cpp#L908) | INFO | - | | GPL | 0036 | [placerBase.cpp:857](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/placerBase.cpp#L857) | INFO | - | | GPL | 0037 | [placerBase.cpp:861](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/placerBase.cpp#L861) | INFO | - | | GPL | 0038 | [nesterovPlace.cpp:670](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovPlace.cpp#L670) | INFO | - | | GPL | 0039 | [routeBase.cpp:139](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/routeBase.cpp#L139) | INFO | - | | GPL | 0040 | [routeBase.cpp:1011](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/routeBase.cpp#L1011) | INFO | - | | GPL | 0041 | [routeBase.cpp:829](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/routeBase.cpp#L829) | INFO | - | | GPL | 0042 | [routeBase.cpp:831](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/routeBase.cpp#L831) | INFO | - | | GPL | 0043 | [routeBase.cpp:873](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/routeBase.cpp#L873) | INFO | - | | GPL | 0044 | [routeBase.cpp:875](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/routeBase.cpp#L875) | INFO | - | | GPL | 0045 | [routeBase.cpp:877](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/routeBase.cpp#L877) | INFO | - | | GPL | 0046 | [routeBase.cpp:879](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/routeBase.cpp#L879) | INFO | - | | GPL | 0047 | [routeBase.cpp:881](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/routeBase.cpp#L881) | INFO | - | | GPL | 0048 | [routeBase.cpp:581](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/routeBase.cpp#L581) | INFO | - | | GPL | 0049 | [routeBase.cpp:600](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/routeBase.cpp#L600) | INFO | - | | GPL | 0050 | [routeBase.cpp:568](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/routeBase.cpp#L568) | INFO | - | | GPL | 0051 | [initialPlace.cpp:171](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/initialPlace.cpp#L171) | INFO | - | | GPL | 0052 | [routeBase.cpp:689](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/routeBase.cpp#L689) | INFO | - | | GPL | 0053 | [routeBase.cpp:706](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/routeBase.cpp#L706) | INFO | - | | GPL | 0054 | [routeBase.cpp:732](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/routeBase.cpp#L732) | INFO | - | | GPL | 0055 | [routeBase.cpp:268](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/routeBase.cpp#L268) | INFO | - | | GPL | 0056 | [routeBase.cpp:273](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/routeBase.cpp#L273) | INFO | - | | GPL | 0057 | [routeBase.cpp:278](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/routeBase.cpp#L278) | INFO | - | | GPL | 0058 | [routeBase.cpp:760](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/routeBase.cpp#L760) | INFO | - | | GPL | 0059 | [routeBase.cpp:767](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/routeBase.cpp#L767) | INFO | - | | GPL | 0060 | [routeBase.cpp:773](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/routeBase.cpp#L773) | INFO | - | | GPL | 0061 | [routeBase.cpp:780](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/routeBase.cpp#L780) | INFO | - | | GPL | 0062 | [routeBase.cpp:786](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/routeBase.cpp#L786) | INFO | - | | GPL | 0063 | [routeBase.cpp:793](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/routeBase.cpp#L793) | INFO | - | | GPL | 0064 | [routeBase.cpp:930](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/routeBase.cpp#L930) | INFO | - | | GPL | 0065 | [routeBase.cpp:931](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/routeBase.cpp#L931) | INFO | - | | GPL | 0066 | [routeBase.cpp:932](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/routeBase.cpp#L932) | INFO | - | | GPL | 0067 | [routeBase.cpp:987](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/routeBase.cpp#L987) | INFO | - | | GPL | 0068 | [routeBase.cpp:988](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/routeBase.cpp#L988) | INFO | - | | GPL | 0069 | [routeBase.cpp:989](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/routeBase.cpp#L989) | INFO | - | | GPL | 0070 | [routeBase.cpp:990](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/routeBase.cpp#L990) | INFO | - | | GPL | 0071 | [routeBase.cpp:992](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/routeBase.cpp#L992) | INFO | - | | GPL | 0072 | [routeBase.cpp:993](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/routeBase.cpp#L993) | INFO | - | | GPL | 0073 | [routeBase.cpp:994](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/routeBase.cpp#L994) | INFO | - | | GPL | 0074 | [routeBase.cpp:995](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/routeBase.cpp#L995) | INFO | - | | GPL | 0075 | [routeBase.cpp:1003](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/routeBase.cpp#L1003) | INFO | - | | GPL | 0076 | [nesterovBase.cpp:3806](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L3806) | INFO | - | | GPL | 0077 | [nesterovBase.cpp:3818](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L3818) | INFO | - | | GPL | 0078 | [nesterovBase.cpp:3832](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L3832) | INFO | - | | GPL | 0079 | [nesterovBase.cpp:3847](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L3847) | INFO | - | | GPL | 0080 | [nesterovBase.cpp:3920](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L3920) | INFO | - | | GPL | 0081 | [nesterovBase.cpp:3988](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L3988) | INFO | - | | GPL | 0082 | [nesterovBase.cpp:3996](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L3996) | INFO | - | | GPL | 0083 | [replace.cpp:123](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/replace.cpp#L123) | INFO | - | | GPL | 0084 | [replace.cpp:361](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/replace.cpp#L361) | INFO | - | | GPL | 0085 | [nesterovPlace.cpp:1266](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovPlace.cpp#L1266) | WARN | - | | GPL | 0086 | [routeBase.cpp:684](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/routeBase.cpp#L684) | INFO | - | | GPL | 0087 | [nesterovPlace.cpp:788](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovPlace.cpp#L788) | INFO | - | | GPL | 0089 | [nesterovPlace.cpp:795](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovPlace.cpp#L795) | INFO | - | | GPL | 0090 | [nesterovPlace.cpp:802](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovPlace.cpp#L802) | INFO | - | | GPL | 0091 | [routeBase.cpp:721](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/routeBase.cpp#L721) | INFO | - | | GPL | 0092 | [nesterovPlace.cpp:460](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovPlace.cpp#L460) | WARN | - | | GPL | 0094 | [replace.tcl:208](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/replace.tcl#L208) | ERROR | - | | GPL | 0095 | [replace.tcl:255](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/replace.tcl#L255) | ERROR | - | | GPL | 0096 | [replace.tcl:219](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/replace.tcl#L219) | INFO | - | | GPL | 0100 | [nesterovPlace.cpp:408](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovPlace.cpp#L408) | INFO | - | | GPL | 0101 | [nesterovPlace.cpp:415](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovPlace.cpp#L415) | INFO | - | | GPL | 0102 | [timingBase.cpp:157](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/timingBase.cpp#L157) | WARN | - | | GPL | 0105 | [timingBase.cpp:141](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/timingBase.cpp#L141) | WARN | - | | GPL | 0106 | [timingBase.cpp:154](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/timingBase.cpp#L154) | INFO | - | | GPL | 0107 | [nesterovPlace.cpp:501](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovPlace.cpp#L501) | INFO | - | | GPL | 0108 | [nesterovPlace.cpp:515](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovPlace.cpp#L515) | INFO | - | | GPL | 0109 | [nesterovPlace.cpp:521](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovPlace.cpp#L521) | INFO | - | | GPL | 0110 | [nesterovPlace.cpp:528](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovPlace.cpp#L528) | INFO | - | | GPL | 0113 | [replace.tcl:102](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/replace.tcl#L102) | ERROR | - | | GPL | 0114 | [replace.tcl:227](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/replace.tcl#L227) | ERROR | - | | GPL | 0117 | [replace.tcl:149](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/replace.tcl#L149) | ERROR | - | | GPL | 0118 | [placerBase.cpp:774](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/placerBase.cpp#L774) | ERROR | - | | GPL | 0119 | [placerBase.cpp:811](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/placerBase.cpp#L811) | ERROR | - | | GPL | 0120 | [placerBase.cpp:817](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/placerBase.cpp#L817) | ERROR | - | | GPL | 0122 | [mbff.cpp:252](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/mbff.cpp#L252) | ERROR | - | | GPL | 0123 | [replace.cpp:226](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/replace.cpp#L226) | WARN | - | | GPL | 0130 | [replace.cpp:113](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/replace.cpp#L113) | ERROR | - | | GPL | 0131 | [replace.tcl:242](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/replace.tcl#L242) | ERROR | - | | GPL | 0133 | [replace.cpp:190](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/replace.cpp#L190) | INFO | - | | GPL | 0134 | [placerBase.cpp:75](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/placerBase.cpp#L75) | WARN | - | | GPL | 0136 | [replace.cpp:289](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/replace.cpp#L289) | WARN | - | | GPL | 0137 | [mbff.cpp:2515](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/mbff.cpp#L2515) | INFO | - | | GPL | 0138 | [mbff.cpp:2538](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/mbff.cpp#L2538) | WARN | - | | GPL | 0153 | [mbff.cpp:1042](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/mbff.cpp#L1042) | ERROR | - | | GPL | 0154 | [replace.cpp:162](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/replace.cpp#L162) | INFO | - | | GPL | 0155 | [replace.cpp:163](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/replace.cpp#L163) | INFO | - | | GPL | 0156 | [replace.cpp:168](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/replace.cpp#L168) | INFO | - | | GPL | 0159 | [routeBase.cpp:634](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/routeBase.cpp#L634) | ERROR | - | | GPL | 0301 | [placerBase.cpp:1481](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/placerBase.cpp#L1481) | ERROR | - | | GPL | 0302 | [nesterovBase.cpp:2143](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L2143) | WARN | - | | GPL | 0304 | [nesterovPlace.cpp:240](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovPlace.cpp#L240) | ERROR | - | | GPL | 0305 | [placerBase.cpp:768](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/placerBase.cpp#L768) | ERROR | - | | GPL | 0306 | [nesterovBase.cpp:722](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L722) | WARN | - | | GPL | 0308 | [nesterovBase.cpp:4012](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L4012) | ERROR | - | | GPL | 0309 | [nesterovBase.cpp:4023](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L4023) | ERROR | - | | GPL | 0310 | [nesterovBase.cpp:4052](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L4052) | ERROR | - | | GPL | 0311 | [nesterovBase.cpp:4068](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L4068) | ERROR | - | | GPL | 0312 | [nesterovBase.cpp:3798](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L3798) | WARN | - | | GPL | 0313 | [nesterovBase.cpp:3739](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L3739) | WARN | - | | GPL | 0314 | [nesterovBase.cpp:2419](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L2419) | ERROR | - | | GPL | 0315 | [nesterovBase.cpp:1616](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L1616) | ERROR | - | | GPL | 0316 | [nesterovBase.cpp:1399](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L1399) | ERROR | - | | GPL | 0317 | [graphicsImpl.cpp:428](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/graphicsImpl.cpp#L428) | WARN | - | | GPL | 0318 | [graphicsImpl.cpp:559](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/graphicsImpl.cpp#L559) | WARN | - | | GPL | 0319 | [nesterovBase.cpp:2318](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L2318) | WARN | - | | GPL | 0320 | [nesterovBase.cpp:2330](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L2330) | WARN | - | | GPL | 0321 | [nesterovBase.cpp:2342](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L2342) | WARN | - | | GPL | 0322 | [nesterovBase.cpp:2355](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L2355) | WARN | - | | GPL | 0323 | [nesterovBase.cpp:3334](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L3334) | WARN | - | | GPL | 0324 | [nesterovBase.cpp:3350](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L3350) | WARN | - | | GPL | 0325 | [initialPlace.cpp:97](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/initialPlace.cpp#L97) | WARN | - | | GPL | 0326 | [placerBase.cpp:509](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/placerBase.cpp#L509) | ERROR | - | | GPL | 0327 | [mbff.cpp:2228](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/mbff.cpp#L2228) | WARN | - | | GPL | 0328 | [nesterovPlace.cpp:1279](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovPlace.cpp#L1279) | WARN | - | | GPL | 0329 | [nesterovPlace.cpp:1297](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovPlace.cpp#L1297) | ERROR | - | | GPL | 0330 | [mbff_orig_name.tcl:25](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/test/mbff_orig_name.tcl#L25) | ERROR | - | | GPL | 0998 | [nesterovPlace.cpp:619](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovPlace.cpp#L619) | WARN | - | | GPL | 0999 | [nesterovPlace.cpp:622](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovPlace.cpp#L622) | WARN | - | | GPL | 1001 | [nesterovBase.cpp:3241](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L3241) | INFO | - | | GPL | 1002 | [nesterovBase.cpp:3260](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L3260) | INFO | - | | GPL | 1003 | [nesterovBase.cpp:3265](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L3265) | INFO | - | | GPL | 1004 | [nesterovBase.cpp:3270](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L3270) | INFO | - | | GPL | 1005 | [nesterovBase.cpp:3254](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L3254) | INFO | - | | GPL | 1006 | [nesterovBase.cpp:3282](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L3282) | INFO | - | | GPL | 1007 | [nesterovBase.cpp:3283](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L3283) | INFO | - | | GPL | 1008 | [nesterovBase.cpp:3289](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L3289) | INFO | - | | GPL | 1009 | [nesterovBase.cpp:3297](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L3297) | INFO | - | | GPL | 1010 | [nesterovPlace.cpp:952](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovPlace.cpp#L952) | WARN | - | | GPL | 1011 | [nesterovPlace.cpp:960](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovPlace.cpp#L960) | INFO | - | | GPL | 1012 | [nesterovPlace.cpp:970](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovPlace.cpp#L970) | INFO | - | | GPL | 1013 | [nesterovPlace.cpp:979](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovPlace.cpp#L979) | INFO | - | | GPL | 1014 | [nesterovPlace.cpp:992](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovPlace.cpp#L992) | INFO | - | | GPL | 1015 | [nesterovBase.cpp:3305](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L3305) | WARN | - | | GPL | 1016 | [nesterovBase.cpp:3235](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L3235) | INFO | - | | GPL | 1017 | [nesterovBase.cpp:3244](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/nesterovBase.cpp#L3244) | INFO | - | | GPL | 9032 | [mbff.cpp:632](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gpl/src/mbff.cpp#L632) | ERROR | - | | GRT | 0001 | [GlobalRouter.cpp:1562](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L1562) | INFO | - | | GRT | 0002 | [GlobalRouter.cpp:1563](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L1563) | INFO | - | | GRT | 0003 | [GlobalRouter.cpp:5223](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L5223) | INFO | - | | GRT | 0004 | [GlobalRouter.cpp:4938](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L4938) | INFO | - | | GRT | 0005 | [GlobalRouter.tcl:612](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.tcl#L612) | ERROR | - | | GRT | 0006 | [GlobalRouter.cpp:609](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L609) | INFO | - | | GRT | 0007 | [GlobalRouter.cpp:397](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L397) | WARN | - | | GRT | 0008 | [GlobalRouter.cpp:2513](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L2513) | WARN | - | | GRT | 0009 | [GlobalRouter.cpp:6205](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L6205) | INFO | - | | GRT | 0010 | [GlobalRouter.cpp:4780](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L4780) | ERROR | - | | GRT | 0011 | [GlobalRouter.cpp:4852](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L4852) | ERROR | - | | GRT | 0012 | [RepairAntennas.cpp:110](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/RepairAntennas.cpp#L110) | INFO | - | | GRT | 0013 | [FastRoute.cpp:482](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/FastRoute.cpp#L482) | ERROR | - | | GRT | 0014 | [GlobalRouter.cpp:460](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L460) | INFO | - | | GRT | 0015 | [GlobalRouter.cpp:643](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L643) | INFO | - | | GRT | 0018 | [GlobalRouter.cpp:4087](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L4087) | INFO | - | | GRT | 0019 | [GlobalRouter.cpp:4715](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L4715) | INFO | - | | GRT | 0020 | [GlobalRouter.cpp:5657](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L5657) | INFO | - | | GRT | 0021 | [GlobalRouter.cpp:5658](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L5658) | INFO | - | | GRT | 0022 | [GlobalRouter.cpp:5659](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L5659) | INFO | - | | GRT | 0023 | [GlobalRouter.cpp:5660](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L5660) | INFO | - | | GRT | 0027 | [RepairAntennas.cpp:166](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/RepairAntennas.cpp#L166) | WARN | - | | GRT | 0028 | [GlobalRouter.cpp:5217](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L5217) | ERROR | - | | GRT | 0029 | [GlobalRouter.cpp:4818](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L4818) | ERROR | - | | GRT | 0030 | [GlobalRouter.cpp:2339](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L2339) | WARN | - | | GRT | 0031 | [GlobalRouter.cpp:3589](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L3589) | WARN | - | | GRT | 0034 | [GlobalRouter.cpp:4765](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L4765) | WARN | - | | GRT | 0035 | [GlobalRouter.cpp:4801](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L4801) | WARN | - | | GRT | 0036 | [GlobalRouter.cpp:4863](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L4863) | WARN | - | | GRT | 0037 | [GlobalRouter.cpp:5004](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L5004) | WARN | - | | GRT | 0038 | [GlobalRouter.cpp:5162](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L5162) | WARN | - | | GRT | 0039 | [GlobalRouter.cpp:5200](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L5200) | WARN | - | | GRT | 0041 | [GlobalRouter.cpp:5308](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L5308) | WARN | - | | GRT | 0042 | [GlobalRouter.cpp:4897](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L4897) | ERROR | - | | GRT | 0044 | [GlobalRouter.tcl:34](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.tcl#L34) | ERROR | - | | GRT | 0045 | [GlobalRouter.tcl:338](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.tcl#L338) | ERROR | - | | GRT | 0047 | [GlobalRouter.tcl:48](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.tcl#L48) | ERROR | - | | GRT | 0048 | [GlobalRouter.tcl:56](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.tcl#L56) | ERROR | - | | GRT | 0051 | [GlobalRouter.tcl:172](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.tcl#L172) | ERROR | - | | GRT | 0052 | [GlobalRouter.tcl:176](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.tcl#L176) | ERROR | - | | GRT | 0053 | [GlobalRouter.cpp:5681](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L5681) | INFO | - | | GRT | 0055 | [GlobalRouter.tcl:189](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.tcl#L189) | ERROR | - | | GRT | 0059 | [GlobalRouter.tcl:584](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.tcl#L584) | ERROR | - | | GRT | 0060 | [GlobalRouter.tcl:596](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.tcl#L596) | ERROR | - | | GRT | 0061 | [GlobalRouter.tcl:600](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.tcl#L600) | ERROR | - | | GRT | 0062 | [GlobalRouter.tcl:627](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.tcl#L627) | ERROR | - | | GRT | 0063 | [GlobalRouter.tcl:634](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.tcl#L634) | ERROR | - | | GRT | 0064 | [GlobalRouter.tcl:640](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.tcl#L640) | ERROR | - | | GRT | 0065 | [GlobalRouter.tcl:644](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.tcl#L644) | ERROR | - | | GRT | 0066 | [GlobalRouter.tcl:648](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.tcl#L648) | ERROR | - | | GRT | 0067 | [GlobalRouter.tcl:652](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.tcl#L652) | ERROR | - | | GRT | 0069 | [GlobalRouter.tcl:293](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.tcl#L293) | ERROR | - | | GRT | 0070 | [GlobalRouter.cpp:780](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L780) | ERROR | - | | GRT | 0072 | [GlobalRouter.cpp:1932](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L1932) | ERROR | - | | GRT | 0073 | [GlobalRouter.tcl:306](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.tcl#L306) | ERROR | - | | GRT | 0074 | [GlobalRouter.cpp:3063](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L3063) | ERROR | - | | GRT | 0075 | [GlobalRouter.cpp:3017](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L3017) | ERROR | - | | GRT | 0076 | [GlobalRouter.cpp:3435](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L3435) | ERROR | - | | GRT | 0079 | [GlobalRouter.cpp:3576](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L3576) | ERROR | - | | GRT | 0080 | [GlobalRouter.cpp:3606](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L3606) | ERROR | - | | GRT | 0081 | [GlobalRouter.cpp:3690](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L3690) | ERROR | - | | GRT | 0082 | [GlobalRouter.cpp:3694](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L3694) | ERROR | - | | GRT | 0083 | [GlobalRouter.cpp:3712](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L3712) | ERROR | - | | GRT | 0084 | [GlobalRouter.cpp:771](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L771) | ERROR | - | | GRT | 0085 | [GlobalRouter.cpp:766](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L766) | ERROR | - | | GRT | 0086 | [GlobalRouter.cpp:4480](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L4480) | ERROR | - | | GRT | 0087 | [GlobalRouter.cpp:3837](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L3837) | ERROR | - | | GRT | 0088 | [GlobalRouter.cpp:4495](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L4495) | INFO | - | | GRT | 0089 | [GlobalRouter.cpp:3854](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L3854) | ERROR | - | | GRT | 0090 | [GlobalRouter.cpp:4516](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L4516) | ERROR | - | | GRT | 0091 | [GlobalRouter.cpp:3889](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L3889) | ERROR | - | | GRT | 0094 | [GlobalRouter.cpp:5233](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L5233) | ERROR | - | | GRT | 0096 | [GlobalRouter.cpp:5746](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L5746) | INFO | - | | GRT | 0100 | [GlobalRouter.cpp:953](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L953) | WARN | - | | GRT | 0101 | [FastRoute.cpp:2072](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/FastRoute.cpp#L2072) | INFO | - | | GRT | 0102 | [FastRoute.cpp:2114](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/FastRoute.cpp#L2114) | INFO | - | | GRT | 0103 | [GlobalRouter.cpp:938](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L938) | WARN | - | | GRT | 0104 | [GlobalRouter.tcl:280](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.tcl#L280) | ERROR | - | | GRT | 0111 | [FastRoute.cpp:245](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/FastRoute.cpp#L245) | INFO | - | | GRT | 0112 | [FastRoute.cpp:246](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/FastRoute.cpp#L246) | INFO | - | | GRT | 0113 | [FastRoute.cpp:637](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/FastRoute.cpp#L637) | WARN | - | | GRT | 0114 | [FastRoute.cpp:675](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/FastRoute.cpp#L675) | WARN | - | | GRT | 0115 | [GlobalRouter.cpp:477](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L477) | WARN | - | | GRT | 0116 | [GlobalRouter.cpp:482](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L482) | ERROR | - | | GRT | 0117 | [CUGR.cpp:522](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/cugr/src/CUGR.cpp#L522) | INFO | - | | GRT | 0118 | [CUGR.cpp:538](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/cugr/src/CUGR.cpp#L538) | WARN | Helpful Information-Do refer to the [GUI guide](https://openroad-flow-scripts.readthedocs.io/en/latest/tutorials/FlowTutorial.html#openroad-gui) and [global routing debugging tips](https://openroad-flow-scripts.readthedocs.io/en/latest/tutorials/FlowTutorial.html#debugging-problems-in-global-routing). | | GRT | 0120 | [heatMapRudy.cpp:126](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/heatMapRudy.cpp#L126) | WARN | - | | GRT | 0121 | [GlobalRouter.cpp:601](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L601) | WARN | - | | GRT | 0122 | [RipUp.cpp:331](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/RipUp.cpp#L331) | ERROR | - | | GRT | 0123 | [RipUp.cpp:440](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/RipUp.cpp#L440) | ERROR | - | | GRT | 0125 | [maze.cpp:571](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/maze.cpp#L571) | ERROR | - | | GRT | 0126 | [GlobalRouter.cpp:800](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L800) | ERROR | - | | GRT | 0127 | [FastRoute.cpp:979](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/FastRoute.cpp#L979) | ERROR | - | | GRT | 0149 | [utility.cpp:2277](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/utility.cpp#L2277) | ERROR | - | | GRT | 0150 | [maze.cpp:1596](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/maze.cpp#L1596) | ERROR | - | | GRT | 0164 | [utility.cpp:2056](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/utility.cpp#L2056) | WARN | - | | GRT | 0165 | [utility.cpp:2071](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/utility.cpp#L2071) | WARN | - | | GRT | 0166 | [utility.cpp:2088](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/utility.cpp#L2088) | WARN | - | | GRT | 0167 | [utility.cpp:2103](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/utility.cpp#L2103) | WARN | - | | GRT | 0169 | [maze.cpp:772](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/maze.cpp#L772) | ERROR | - | | GRT | 0170 | [GlobalRouter.cpp:2452](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L2452) | ERROR | - | | GRT | 0171 | [maze3D.cpp:381](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/maze3D.cpp#L381) | ERROR | - | | GRT | 0172 | [maze3D.cpp:643](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/maze3D.cpp#L643) | ERROR | - | | GRT | 0179 | [route.cpp:254](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/route.cpp#L254) | WARN | - | | GRT | 0181 | [route.cpp:714](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/route.cpp#L714) | WARN | - | | GRT | 0183 | [maze3D.cpp:1185](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/maze3D.cpp#L1185) | ERROR | - | | GRT | 0187 | [maze3D.cpp:367](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/maze3D.cpp#L367) | ERROR | - | | GRT | 0188 | [RSMT.cpp:112](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/RSMT.cpp#L112) | ERROR | - | | GRT | 0189 | [RSMT.cpp:132](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/RSMT.cpp#L132) | ERROR | - | | GRT | 0197 | [utility.cpp:350](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/utility.cpp#L350) | INFO | - | | GRT | 0198 | [utility.cpp:351](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/utility.cpp#L351) | INFO | - | | GRT | 0199 | [utility.cpp:352](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/utility.cpp#L352) | INFO | - | | GRT | 0200 | [utility.cpp:999](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/utility.cpp#L999) | WARN | - | | GRT | 0201 | [maze.cpp:642](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/maze.cpp#L642) | ERROR | - | | GRT | 0202 | [utility.cpp:1068](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/utility.cpp#L1068) | ERROR | - | | GRT | 0203 | [utility.cpp:1428](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/utility.cpp#L1428) | ERROR | - | | GRT | 0204 | [utility.cpp:1509](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/utility.cpp#L1509) | ERROR | - | | GRT | 0206 | [utility.cpp:1633](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/utility.cpp#L1633) | ERROR | - | | GRT | 0207 | [utility.cpp:2035](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/utility.cpp#L2035) | WARN | - | | GRT | 0208 | [utility.cpp:2044](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/utility.cpp#L2044) | WARN | - | | GRT | 0209 | [GlobalRouter.cpp:4868](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L4868) | ERROR | - | | GRT | 0213 | [FastRoute.cpp:902](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/FastRoute.cpp#L902) | ERROR | - | | GRT | 0214 | [FastRoute.cpp:920](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/FastRoute.cpp#L920) | ERROR | - | | GRT | 0215 | [GlobalRouter.tcl:332](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.tcl#L332) | WARN | - | | GRT | 0216 | [FastRoute.cpp:1040](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/FastRoute.cpp#L1040) | ERROR | - | | GRT | 0219 | [GlobalRouter.tcl:105](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.tcl#L105) | ERROR | - | | GRT | 0222 | [GlobalRouter.tcl:607](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.tcl#L607) | ERROR | - | | GRT | 0223 | [GlobalRouter.tcl:384](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.tcl#L384) | ERROR | - | | GRT | 0224 | [GlobalRouter.tcl:470](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.tcl#L470) | ERROR | - | | GRT | 0225 | [RipUp.cpp:89](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/RipUp.cpp#L89) | ERROR | - | | GRT | 0226 | [RipUp.cpp:111](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/RipUp.cpp#L111) | ERROR | - | | GRT | 0228 | [utility.cpp:1933](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/utility.cpp#L1933) | ERROR | - | | GRT | 0229 | [utility.cpp:1947](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/utility.cpp#L1947) | ERROR | - | | GRT | 0230 | [FastRoute.cpp:2421](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/FastRoute.cpp#L2421) | WARN | - | | GRT | 0231 | [GlobalRouter.tcl:443](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.tcl#L443) | ERROR | - | | GRT | 0232 | [GlobalRouter.cpp:6290](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L6290) | ERROR | - | | GRT | 0233 | [GlobalRouter.cpp:2532](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L2532) | ERROR | - | | GRT | 0234 | [GlobalRouter.cpp:2555](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L2555) | ERROR | - | | GRT | 0235 | [GlobalRouter.cpp:2575](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L2575) | ERROR | - | | GRT | 0236 | [GlobalRouter.cpp:2584](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L2584) | ERROR | - | | GRT | 0237 | [GlobalRouter.cpp:5949](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L5949) | INFO | - | | GRT | 0238 | [GlobalRouter.tcl:502](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.tcl#L502) | ERROR | - | | GRT | 0239 | [GlobalRouter.cpp:5973](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L5973) | WARN | - | | GRT | 0240 | [GlobalRouter.cpp:5979](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L5979) | INFO | - | | GRT | 0241 | [GlobalRouter.cpp:5944](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L5944) | WARN | - | | GRT | 0242 | [GlobalRouter.tcl:125](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.tcl#L125) | ERROR | - | | GRT | 0243 | [RepairAntennas.cpp:220](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/RepairAntennas.cpp#L220) | WARN | - | | GRT | 0244 | [GlobalRouter.cpp:586](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L586) | ERROR | - | | GRT | 0245 | [GlobalRouter.tcl:309](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.tcl#L309) | ERROR | - | | GRT | 0246 | [GlobalRouter.cpp:580](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L580) | WARN | - | | GRT | 0247 | [utility.cpp:1827](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/utility.cpp#L1827) | ERROR | - | | GRT | 0248 | [utility.cpp:1838](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/utility.cpp#L1838) | ERROR | - | | GRT | 0249 | [GlobalRouter.cpp:2519](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L2519) | ERROR | - | | GRT | 0250 | [GlobalRouter.cpp:2564](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L2564) | WARN | - | | GRT | 0252 | [GlobalRouter.tcl:352](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.tcl#L352) | ERROR | - | | GRT | 0253 | [GlobalRouter.cpp:2886](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L2886) | ERROR | - | | GRT | 0254 | [utility.cpp:249](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/utility.cpp#L249) | ERROR | - | | GRT | 0255 | [GlobalRouter.cpp:3136](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L3136) | ERROR | - | | GRT | 0256 | [GlobalRouter.cpp:3170](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L3170) | ERROR | - | | GRT | 0257 | [GlobalRouter.cpp:3183](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L3183) | ERROR | - | | GRT | 0258 | [GlobalRouter.cpp:3206](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L3206) | ERROR | - | | GRT | 0259 | [GlobalRouter.cpp:3212](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L3212) | ERROR | - | | GRT | 0260 | [GlobalRouter.cpp:3215](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L3215) | ERROR | - | | GRT | 0261 | [GlobalRouter.cpp:3225](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L3225) | ERROR | - | | GRT | 0262 | [GlobalRouter.cpp:3236](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L3236) | ERROR | - | | GRT | 0263 | [GlobalRouter.cpp:3241](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L3241) | ERROR | - | | GRT | 0264 | [GlobalRouter.cpp:3331](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L3331) | ERROR | - | | GRT | 0265 | [GlobalRouter.cpp:3360](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L3360) | ERROR | - | | GRT | 0266 | [GlobalRouter.cpp:1120](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L1120) | ERROR | - | | GRT | 0267 | [GlobalRouter.cpp:989](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L989) | ERROR | - | | GRT | 0268 | [GlobalRouter.cpp:1142](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L1142) | ERROR | - | | GRT | 0269 | [GlobalRouter.tcl:451](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.tcl#L451) | ERROR | - | | GRT | 0270 | [GlobalRouter.cpp:325](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L325) | ERROR | - | | GRT | 0271 | [GlobalRouter.cpp:6106](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L6106) | ERROR | - | | GRT | 0272 | [GlobalRouter.cpp:1739](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L1739) | ERROR | - | | GRT | 0273 | [FastRoute.cpp:2509](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/FastRoute.cpp#L2509) | WARN | - | | GRT | 0274 | [GridGraph.cpp:646](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/cugr/src/GridGraph.cpp#L646) | WARN | - | | GRT | 0275 | [MazeRoute.cpp:252](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/cugr/src/MazeRoute.cpp#L252) | ERROR | - | | GRT | 0276 | [MazeRoute.cpp:359](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/cugr/src/MazeRoute.cpp#L359) | ERROR | - | | GRT | 0277 | [PatternRoute.cpp:522](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/cugr/src/PatternRoute.cpp#L522) | WARN | - | | GRT | 0278 | [GlobalRouter.cpp:5848](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L5848) | INFO | - | | GRT | 0279 | [GlobalRouter.cpp:5881](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L5881) | INFO | - | | GRT | 0280 | [GlobalRouter.cpp:4551](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L4551) | INFO | - | | GRT | 0281 | [GlobalRouter.cpp:4561](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L4561) | WARN | - | | GRT | 0282 | [MazeRoute.cpp:235](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/cugr/src/MazeRoute.cpp#L235) | ERROR | - | | GRT | 0283 | [GridGraph.cpp:654](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/cugr/src/GridGraph.cpp#L654) | ERROR | - | | GRT | 0284 | [MazeRoute.cpp:287](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/cugr/src/MazeRoute.cpp#L287) | ERROR | - | | GRT | 0285 | [MazeRoute.cpp:307](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/cugr/src/MazeRoute.cpp#L307) | ERROR | - | | GRT | 0286 | [PatternRoute.cpp:674](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/cugr/src/PatternRoute.cpp#L674) | ERROR | - | | GRT | 0287 | [GlobalRouter.tcl:570](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.tcl#L570) | ERROR | - | | GRT | 0288 | [GlobalRouter.tcl:575](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.tcl#L575) | ERROR | - | | GRT | 0289 | [GlobalRouter.tcl:517](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.tcl#L517) | ERROR | - | | GRT | 0290 | [GlobalRouter.tcl:523](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.tcl#L523) | ERROR | - | | GRT | 0291 | [GlobalRouter.tcl:536](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.tcl#L536) | ERROR | - | | GRT | 0292 | [GlobalRouter.tcl:549](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.tcl#L549) | ERROR | - | | GRT | 0293 | [GlobalRouter.tcl:563](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.tcl#L563) | ERROR | - | | GRT | 0294 | [GlobalRouter.tcl:325](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.tcl#L325) | ERROR | - | | GRT | 0295 | [GlobalRouter.tcl:254](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.tcl#L254) | ERROR | - | | GRT | 0296 | [FastRoute.cpp:2747](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/FastRoute.cpp#L2747) | WARN | - | | GRT | 0297 | [FastRoute.cpp:2689](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/FastRoute.cpp#L2689) | WARN | - | | GRT | 0300 | [GlobalRouter.cpp:2492](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L2492) | WARN | - | | GRT | 0301 | [GlobalRouter.cpp:2319](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L2319) | WARN | - | | GRT | 0302 | [RepairAntennas.cpp:1203](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/RepairAntennas.cpp#L1203) | INFO | - | | GRT | 0303 | [GlobalRouter.cpp:445](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L445) | INFO | - | | GRT | 0304 | [GlobalRouter.cpp:1028](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L1028) | WARN | - | | GRT | 0305 | [CUGR.cpp:511](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/cugr/src/CUGR.cpp#L511) | WARN | - | | GRT | 0306 | [CUGR.cpp:528](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/cugr/src/CUGR.cpp#L528) | INFO | - | | GRT | 0500 | [RipUp.cpp:190](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/RipUp.cpp#L190) | ERROR | - | | GRT | 0600 | [CUGR.cpp:925](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/cugr/src/CUGR.cpp#L925) | WARN | - | | GRT | 0601 | [maze3D.cpp:926](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/maze3D.cpp#L926) | ERROR | - | | GRT | 0602 | [maze3D.cpp:979](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/maze3D.cpp#L979) | ERROR | - | | GRT | 0603 | [maze3D.cpp:1032](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/maze3D.cpp#L1032) | ERROR | - | | GRT | 0604 | [maze3D.cpp:1083](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/maze3D.cpp#L1083) | ERROR | - | | GRT | 0605 | [maze3D.cpp:1130](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/maze3D.cpp#L1130) | ERROR | - | | GRT | 0606 | [maze3D.cpp:1175](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/maze3D.cpp#L1175) | ERROR | - | | GRT | 0607 | [maze.cpp:1291](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/maze.cpp#L1291) | ERROR | - | | GRT | 0610 | [CUGR.cpp:306](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/cugr/src/CUGR.cpp#L306) | ERROR | - | | GRT | 0611 | [CUGR.cpp:695](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/cugr/src/CUGR.cpp#L695) | ERROR | - | | GRT | 0701 | [GlobalRouter.cpp:5363](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L5363) | ERROR | - | | GRT | 0703 | [GlobalRouter.cpp:5512](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L5512) | ERROR | - | | GRT | 0704 | [GlobalRouter.cpp:508](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/GlobalRouter.cpp#L508) | WARN | - | | GRT | 0706 | [snapshot_batched_smoke.tcl:38](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/test/snapshot_batched_smoke.tcl#L38) | ERROR | - | | GRT | 1247 | [utility.cpp:1900](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/utility.cpp#L1900) | ERROR | - | | GRT | 1248 | [utility.cpp:1913](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/fastroute/src/utility.cpp#L1913) | ERROR | - | | GRT | 1249 | [GridGraph.cpp:422](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/cugr/src/GridGraph.cpp#L422) | ERROR | - | | GRT | 1250 | [GridGraph.cpp:450](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/cugr/src/GridGraph.cpp#L450) | ERROR | - | | GRT | 1251 | [GridGraph.cpp:709](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/cugr/src/GridGraph.cpp#L709) | ERROR | - | | GRT | 1252 | [GridGraph.cpp:763](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/cugr/src/GridGraph.cpp#L763) | ERROR | - | | GRT | 1253 | [GridGraph.cpp:776](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/cugr/src/GridGraph.cpp#L776) | ERROR | - | | GRT | 1256 | [GridGraph.cpp:1052](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/cugr/src/GridGraph.cpp#L1052) | ERROR | - | | GRT | 1257 | [GridGraph.cpp:1066](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/grt/src/cugr/src/GridGraph.cpp#L1066) | ERROR | - | | GUI | 0001 | [gui.i:17](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.i#L17) | INFO | - | | GUI | 0002 | [gui.i:23](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.i#L23) | ERROR | - | | GUI | 0003 | [gui.i:34](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.i#L34) | ERROR | - | | GUI | 0004 | [chartsWidget.cpp:324](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/chartsWidget.cpp#L324) | ERROR | - | | GUI | 0005 | [gui.i:38](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.i#L38) | ERROR | - | | GUI | 0006 | [gui.i:42](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.i#L42) | ERROR | - | | GUI | 0007 | [gui.i:407](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.i#L407) | ERROR | - | | GUI | 0008 | [gui.cpp:1509](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.cpp#L1509) | WARN | - | | GUI | 0009 | [gui.i:430](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.i#L430) | ERROR | - | | GUI | 0010 | [gui_utils.cpp:43](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui_utils.cpp#L43) | WARN | - | | GUI | 0011 | [gui_utils.cpp:93](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui_utils.cpp#L93) | WARN | - | | GUI | 0012 | [gui_utils.cpp:98](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui_utils.cpp#L98) | WARN | - | | GUI | 0013 | [displayControls.cpp:1157](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/displayControls.cpp#L1157) | ERROR | - | | GUI | 0014 | [displayControls.cpp:1203](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/displayControls.cpp#L1203) | WARN | - | | GUI | 0015 | [gui.cpp:780](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.cpp#L780) | ERROR | - | | GUI | 0019 | [web.tcl:125](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/web/src/web.tcl#L125) | ERROR | - | | GUI | 0020 | [gui.tcl:17](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.tcl#L17) | ERROR | - | | GUI | 0021 | [gui.tcl:22](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.tcl#L22) | ERROR | - | | GUI | 0022 | [mainWindow.cpp:932](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/mainWindow.cpp#L932) | ERROR | - | | GUI | 0023 | [mainWindow.cpp:1489](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/mainWindow.cpp#L1489) | WARN | - | | GUI | 0024 | [mainWindow.cpp:1296](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/mainWindow.cpp#L1296) | WARN | - | | GUI | 0025 | [mainWindow.cpp:1028](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/mainWindow.cpp#L1028) | ERROR | - | | GUI | 0026 | [gui.tcl:48](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.tcl#L48) | ERROR | - | | GUI | 0027 | [gui.tcl:53](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.tcl#L53) | ERROR | - | | GUI | 0028 | [gui.cpp:1036](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.cpp#L1036) | ERROR | - | | GUI | 0029 | [gui.cpp:1065](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.cpp#L1065) | ERROR | - | | GUI | 0030 | [drcWidget.cpp:399](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/drcWidget.cpp#L399) | WARN | - | | GUI | 0032 | [drcWidget.cpp:369](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/drcWidget.cpp#L369) | ERROR | - | | GUI | 0033 | [descriptor_registry.cpp:95](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/descriptor_registry.cpp#L95) | WARN | - | | GUI | 0034 | [displayControls.cpp:1215](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/displayControls.cpp#L1215) | WARN | - | | GUI | 0035 | [gui.cpp:584](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.cpp#L584) | ERROR | - | | GUI | 0036 | [gui.i:574](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.i#L574) | ERROR | - | | GUI | 0037 | [gui.i:580](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.i#L580) | ERROR | - | | GUI | 0038 | [gui.tcl:225](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.tcl#L225) | ERROR | - | | GUI | 0039 | [gui.tcl:253](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.tcl#L253) | WARN | - | | GUI | 0040 | [displayControls.cpp:1178](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/displayControls.cpp#L1178) | ERROR | - | | GUI | 0041 | [gui.i:403](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.i#L403) | ERROR | - | | GUI | 0042 | [painter.cpp:87](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/painter.cpp#L87) | ERROR | - | | GUI | 0043 | [painter.cpp:72](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/painter.cpp#L72) | ERROR | - | | GUI | 0044 | [mainWindow.cpp:1253](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/mainWindow.cpp#L1253) | WARN | - | | GUI | 0045 | [painter.cpp:126](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/painter.cpp#L126) | ERROR | - | | GUI | 0046 | [gui.tcl:362](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.tcl#L362) | ERROR | - | | GUI | 0047 | [gui.tcl:366](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.tcl#L366) | ERROR | - | | GUI | 0048 | [gui.tcl:101](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.tcl#L101) | ERROR | - | | GUI | 0049 | [gui.cpp:1582](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.cpp#L1582) | ERROR | - | | GUI | 0050 | [gui.cpp:1610](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.cpp#L1610) | ERROR | - | | GUI | 0051 | [gui.cpp:1605](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.cpp#L1605) | WARN | - | | GUI | 0053 | [descriptor_registry.cpp:67](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/descriptor_registry.cpp#L67) | ERROR | - | | GUI | 0054 | [displayControls.cpp:855](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/displayControls.cpp#L855) | WARN | - | | GUI | 0055 | [gui.tcl:93](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.tcl#L93) | WARN | - | | GUI | 0056 | [gui.tcl:244](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.tcl#L244) | ERROR | - | | GUI | 0057 | [displayControls.cpp:775](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/displayControls.cpp#L775) | WARN | - | | GUI | 0058 | [gui.cpp:1692](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.cpp#L1692) | WARN | - | | GUI | 0059 | [gui.cpp:568](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.cpp#L568) | ERROR | - | | GUI | 0060 | [gui.cpp:1084](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.cpp#L1084) | ERROR | - | | GUI | 0061 | [gui.cpp:1093](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.cpp#L1093) | ERROR | - | | GUI | 0062 | [gui.cpp:1102](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.cpp#L1102) | ERROR | - | | GUI | 0063 | [gui.cpp:1109](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.cpp#L1109) | ERROR | - | | GUI | 0064 | [gui.cpp:793](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.cpp#L793) | ERROR | - | | GUI | 0066 | [heatMapCore.cpp:865](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/heatMapCore.cpp#L865) | WARN | - | | GUI | 0067 | [gui.tcl:287](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.tcl#L287) | ERROR | - | | GUI | 0068 | [gui.tcl:296](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.tcl#L296) | ERROR | - | | GUI | 0069 | [gui.tcl:299](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.tcl#L299) | ERROR | - | | GUI | 0070 | [gui.tcl:330](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.tcl#L330) | ERROR | - | | GUI | 0071 | [gui.tcl:337](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.tcl#L337) | ERROR | - | | GUI | 0072 | [heatMapCore.cpp:197](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/heatMapCore.cpp#L197) | ERROR | - | | GUI | 0073 | [heatMapCore.cpp:202](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/heatMapCore.cpp#L202) | ERROR | - | | GUI | 0074 | [clockWidget.cpp:1695](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/clockWidget.cpp#L1695) | ERROR | - | | GUI | 0075 | [gui.cpp:186](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.cpp#L186) | INFO | - | | GUI | 0076 | [gui.cpp:189](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.cpp#L189) | WARN | - | | GUI | 0077 | [gui.cpp:193](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.cpp#L193) | ERROR | - | | GUI | 0078 | [layoutViewer.cpp:2315](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/layoutViewer.cpp#L2315) | WARN | - | | GUI | 0079 | [gui.cpp:1626](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.cpp#L1626) | ERROR | - | | GUI | 0080 | [gui.cpp:1631](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.cpp#L1631) | ERROR | - | | GUI | 0081 | [gui.cpp:1586](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.cpp#L1586) | ERROR | - | | GUI | 0088 | [gui.tcl:173](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.tcl#L173) | ERROR | - | | GUI | 0089 | [clockWidget.cpp:1715](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/clockWidget.cpp#L1715) | ERROR | - | | GUI | 0090 | [gui.i:668](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.i#L668) | ERROR | - | | GUI | 0091 | [gui.i:681](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.i#L681) | ERROR | - | | GUI | 0092 | [gui.i:694](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.i#L694) | ERROR | - | | GUI | 0093 | [gui.i:707](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.i#L707) | ERROR | - | | GUI | 0094 | [layoutViewer.cpp:2253](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/layoutViewer.cpp#L2253) | WARN | - | | GUI | 0095 | [gui.cpp:1135](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.cpp#L1135) | ERROR | - | | GUI | 0096 | [gui.i:510](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.i#L510) | INFO | - | | GUI | 0097 | [chartsWidget.cpp:540](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/chartsWidget.cpp#L540) | WARN | - | | GUI | 0099 | [gui.tcl:108](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.tcl#L108) | ERROR | - | | GUI | 0100 | [gui.cpp:394](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.cpp#L394) | ERROR | - | | GUI | 0101 | [gui.cpp:411](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.cpp#L411) | ERROR | - | | GUI | 0102 | [renderThread.cpp:146](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/renderThread.cpp#L146) | WARN | - | | GUI | 0103 | [renderThread.cpp:149](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/renderThread.cpp#L149) | WARN | - | | GUI | 0104 | [drcWidget.cpp:124](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/drcWidget.cpp#L124) | ERROR | - | | GUI | 0105 | [gui.tcl:113](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.tcl#L113) | ERROR | - | | GUI | 0106 | [gui.tcl:141](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.tcl#L141) | ERROR | - | | GUI | 0107 | [gui.cpp:1698](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/gui.cpp#L1698) | WARN | - | | GUI | 0108 | [mainWindow.cpp:1916](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/mainWindow.cpp#L1916) | ERROR | - | | GUI | 0109 | [mainWindow.cpp:1906](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/mainWindow.cpp#L1906) | WARN | - | | GUI | 0110 | [drcWidget.cpp:375](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/drcWidget.cpp#L375) | WARN | - | | GUI | 0111 | [staGuiInterface.cpp:278](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/staGuiInterface.cpp#L278) | ERROR | - | | GUI | 0112 | [descriptor_registry.cpp:101](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/gui/src/descriptor_registry.cpp#L101) | WARN | - | | IFP | 0001 | [InitFloorplan.cc:744](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.cc#L744) | INFO | - | | IFP | 0002 | [InitFloorplan.cc:363](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.cc#L363) | ERROR | - | | IFP | 0005 | [InitFloorplan.tcl:407](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.tcl#L407) | INFO | - | | IFP | 0010 | [InitFloorplan.tcl:173](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.tcl#L173) | ERROR | - | | IFP | 0013 | [InitFloorplan.tcl:325](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.tcl#L325) | ERROR | - | | IFP | 0014 | [InitFloorplan.tcl:312](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.tcl#L312) | ERROR | - | | IFP | 0015 | [InitFloorplan.tcl:353](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.tcl#L353) | ERROR | - | | IFP | 0018 | [InitFloorplan.i:192](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.i#L192) | ERROR | - | | IFP | 0019 | [InitFloorplan.tcl:370](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.tcl#L370) | ERROR | - | | IFP | 0020 | [InitFloorplan.tcl:25](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.tcl#L25) | ERROR | - | | IFP | 0021 | [InitFloorplan.cc:1055](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.cc#L1055) | WARN | - | | IFP | 0022 | [InitFloorplan.cc:1063](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.cc#L1063) | WARN | - | | IFP | 0023 | [InitFloorplan.tcl:346](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.tcl#L346) | ERROR | - | | IFP | 0024 | [InitFloorplan.tcl:31](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.tcl#L31) | ERROR | - | | IFP | 0025 | [InitFloorplan.tcl:176](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.tcl#L176) | ERROR | - | | IFP | 0026 | [InitFloorplan.cc:617](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.cc#L617) | WARN | - | | IFP | 0027 | [InitFloorplan.cc:644](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.cc#L644) | WARN | - | | IFP | 0028 | [InitFloorplan.cc:491](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.cc#L491) | WARN | - | | IFP | 0029 | [InitFloorplan.cc:949](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.cc#L949) | ERROR | - | | IFP | 0030 | [InitFloorplan.cc:974](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.cc#L974) | INFO | - | | IFP | 0031 | [InitFloorplan.tcl:242](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.tcl#L242) | ERROR | - | | IFP | 0032 | [InitFloorplan.tcl:247](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.tcl#L247) | ERROR | - | | IFP | 0033 | [InitFloorplan.tcl:349](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.tcl#L349) | ERROR | - | | IFP | 0034 | [InitFloorplan.tcl:328](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.tcl#L328) | ERROR | - | | IFP | 0035 | [InitFloorplan.tcl:262](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.tcl#L262) | ERROR | - | | IFP | 0036 | [InitFloorplan.cc:93](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.cc#L93) | ERROR | - | | IFP | 0044 | [InitFloorplan.cc:1120](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.cc#L1120) | ERROR | - | | IFP | 0045 | [InitFloorplan.cc:1133](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.cc#L1133) | ERROR | - | | IFP | 0048 | [InitFloorplan.cc:824](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.cc#L824) | ERROR | - | | IFP | 0049 | [InitFloorplan.cc:861](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.cc#L861) | INFO | - | | IFP | 0050 | [InitFloorplan.cc:887](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.cc#L887) | INFO | - | | IFP | 0051 | [InitFloorplan.cc:503](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.cc#L503) | ERROR | - | | IFP | 0052 | [InitFloorplan.cc:697](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.cc#L697) | WARN | - | | IFP | 0053 | [InitFloorplan.cc:933](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.cc#L933) | ERROR | - | | IFP | 0054 | [InitFloorplan.cc:757](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.cc#L757) | ERROR | - | | IFP | 0055 | [InitFloorplan.cc:468](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.cc#L468) | ERROR | - | | IFP | 0056 | [InitFloorplan.cc:998](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.cc#L998) | WARN | - | | IFP | 0057 | [InitFloorplan.tcl:283](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.tcl#L283) | ERROR | - | | IFP | 0058 | [InitFloorplan.tcl:130](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.tcl#L130) | ERROR | - | | IFP | 0059 | [InitFloorplan.tcl:93](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.tcl#L93) | ERROR | - | | IFP | 0060 | [InitFloorplan.tcl:88](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.tcl#L88) | ERROR | - | | IFP | 0061 | [InitFloorplan.cc:742](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.cc#L742) | WARN | - | | IFP | 0062 | [InitFloorplan.tcl:149](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.tcl#L149) | ERROR | - | | IFP | 0063 | [InitFloorplan.cc:464](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.cc#L464) | ERROR | - | | IFP | 0064 | [InitFloorplan.cc:415](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.cc#L415) | ERROR | - | | IFP | 0065 | [InitFloorplan.cc:771](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.cc#L771) | ERROR | - | | IFP | 0075 | [InitFloorplan.tcl:377](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.tcl#L377) | ERROR | - | | IFP | 0076 | [InitFloorplan.tcl:381](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.tcl#L381) | ERROR | - | | IFP | 0077 | [InitFloorplan.tcl:385](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.tcl#L385) | ERROR | - | | IFP | 0078 | [InitFloorplan.tcl:398](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.tcl#L398) | ERROR | - | | IFP | 0082 | [InitFloorplan.tcl:426](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.tcl#L426) | ERROR | - | | IFP | 0083 | [InitFloorplan.tcl:430](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.tcl#L430) | ERROR | - | | IFP | 0084 | [InitFloorplan.tcl:439](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.tcl#L439) | ERROR | - | | IFP | 0085 | [InitFloorplan.tcl:417](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.tcl#L417) | ERROR | - | | IFP | 0100 | [InitFloorplan.cc:1364](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.cc#L1364) | INFO | - | | IFP | 0101 | [InitFloorplan.cc:1372](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.cc#L1372) | INFO | - | | IFP | 0102 | [InitFloorplan.cc:1380](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.cc#L1380) | INFO | - | | IFP | 0103 | [InitFloorplan.cc:1386](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.cc#L1386) | INFO | - | | IFP | 0104 | [InitFloorplan.cc:1393](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.cc#L1393) | INFO | - | | IFP | 0105 | [InitFloorplan.cc:1399](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.cc#L1399) | INFO | - | | IFP | 0106 | [InitFloorplan.cc:210](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.cc#L210) | INFO | - | | IFP | 0107 | [InitFloorplan.cc:163](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.cc#L163) | INFO | - | | IFP | 0987 | [InitFloorplan.cc:213](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.cc#L213) | ERROR | - | | IFP | 0988 | [InitFloorplan.cc:217](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.cc#L217) | ERROR | - | | IFP | 0991 | [InitFloorplan.cc:274](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.cc#L274) | ERROR | - | | IFP | 0992 | [InitFloorplan.cc:278](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.cc#L278) | ERROR | - | | IFP | 0997 | [InitFloorplan.cc:326](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.cc#L326) | INFO | - | | IFP | 1000 | [InitFloorplan.cc:1161](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.cc#L1161) | ERROR | - | | IFP | 1001 | [InitFloorplan.cc:1197](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.cc#L1197) | ERROR | - | | IFP | 1002 | [InitFloorplan.cc:1353](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.cc#L1353) | INFO | - | | IFP | 1003 | [InitFloorplan.cc:1181](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.cc#L1181) | WARN | - | | IFP | 1004 | [InitFloorplan.cc:303](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.cc#L303) | ERROR | - | | IFP | 1005 | [InitFloorplan.cc:295](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ifp/src/InitFloorplan.cc#L295) | ERROR | - | | MPL | 0001 | [mpl.tcl:53](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/mpl.tcl#L53) | ERROR | - | | MPL | 0002 | [snapper.cpp:250](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/snapper.cpp#L250) | WARN | - | | MPL | 0003 | [hier_rtlmp.cpp:645](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/hier_rtlmp.cpp#L645) | ERROR | - | | MPL | 0004 | [hier_rtlmp.cpp:726](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/hier_rtlmp.cpp#L726) | ERROR | - | | MPL | 0005 | [snapper.cpp:284](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/snapper.cpp#L284) | ERROR | - | | MPL | 0006 | [clusterEngine.cpp:2098](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/clusterEngine.cpp#L2098) | ERROR | - | | MPL | 0007 | [clusterEngine.cpp:662](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/clusterEngine.cpp#L662) | ERROR | - | | MPL | 0010 | [hier_rtlmp.cpp:1993](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/hier_rtlmp.cpp#L1993) | ERROR | - | | MPL | 0011 | [hier_rtlmp.cpp:2492](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/hier_rtlmp.cpp#L2492) | ERROR | - | | MPL | 0012 | [mpl.tcl:244](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/mpl.tcl#L244) | ERROR | - | | MPL | 0013 | [hier_rtlmp.cpp:216](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/hier_rtlmp.cpp#L216) | INFO | - | | MPL | 0015 | [graphics.cpp:502](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/graphics.cpp#L502) | ERROR | - | | MPL | 0016 | [clusterEngine.cpp:122](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/clusterEngine.cpp#L122) | ERROR | - | | MPL | 0017 | [clusterEngine.cpp:113](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/clusterEngine.cpp#L113) | INFO | - | | MPL | 0018 | [SimulatedAnnealingCore.cpp:585](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/SimulatedAnnealingCore.cpp#L585) | ERROR | - | | MPL | 0019 | [mpl.tcl:232](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/mpl.tcl#L232) | ERROR | - | | MPL | 0020 | [mpl.tcl:388](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/mpl.tcl#L388) | ERROR | - | | MPL | 0021 | [mpl.tcl:390](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/mpl.tcl#L390) | ERROR | - | | MPL | 0022 | [mpl.tcl:240](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/mpl.tcl#L240) | ERROR | - | | MPL | 0023 | [clusterEngine.cpp:1345](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/clusterEngine.cpp#L1345) | CRITICAL | - | | MPL | 0024 | [clusterEngine.cpp:1375](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/clusterEngine.cpp#L1375) | CRITICAL | - | | MPL | 0025 | [clusterEngine.cpp:59](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/clusterEngine.cpp#L59) | WARN | - | | MPL | 0026 | [clusterEngine.cpp:431](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/clusterEngine.cpp#L431) | WARN | - | | MPL | 0027 | [hier_rtlmp.cpp:386](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/hier_rtlmp.cpp#L386) | WARN | - | | MPL | 0028 | [clusterEngine.cpp:1997](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/clusterEngine.cpp#L1997) | CRITICAL | - | | MPL | 0029 | [clusterEngine.cpp:2017](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/clusterEngine.cpp#L2017) | CRITICAL | - | | MPL | 0030 | [mpl.tcl:280](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/mpl.tcl#L280) | ERROR | - | | MPL | 0031 | [mpl.tcl:284](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/mpl.tcl#L284) | ERROR | - | | MPL | 0032 | [mpl.tcl:293](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/mpl.tcl#L293) | ERROR | - | | MPL | 0033 | [mpl.tcl:295](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/mpl.tcl#L295) | ERROR | - | | MPL | 0034 | [rtl_mp.cpp:105](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/rtl_mp.cpp#L105) | ERROR | - | | MPL | 0035 | [rtl_mp.cpp:156](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/rtl_mp.cpp#L156) | INFO | - | | MPL | 0036 | [rtl_mp.cpp:126](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/rtl_mp.cpp#L126) | WARN | - | | MPL | 0037 | [object.cpp:923](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/object.cpp#L923) | ERROR | - | | MPL | 0038 | [mpl.tcl:335](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/mpl.tcl#L335) | ERROR | - | | MPL | 0039 | [snapper.cpp:103](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/snapper.cpp#L103) | ERROR | - | | MPL | 0040 | [hier_rtlmp.cpp:1494](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/hier_rtlmp.cpp#L1494) | ERROR | - | | MPL | 0041 | [rtl_mp.cpp:146](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/rtl_mp.cpp#L146) | ERROR | - | | MPL | 0042 | [rtl_mp.cpp:194](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/rtl_mp.cpp#L194) | ERROR | - | | MPL | 0043 | [mpl.tcl:272](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/mpl.tcl#L272) | ERROR | - | | MPL | 0044 | [rtl_mp.cpp:210](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/rtl_mp.cpp#L210) | WARN | - | | MPL | 0045 | [clusterEngine.cpp:1207](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/clusterEngine.cpp#L1207) | ERROR | - | | MPL | 0046 | [hier_rtlmp.cpp:2563](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/hier_rtlmp.cpp#L2563) | CRITICAL | - | | MPL | 0047 | [SimulatedAnnealingCore.cpp:341](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/SimulatedAnnealingCore.cpp#L341) | CRITICAL | - | | MPL | 0048 | [mpl.tcl:327](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/mpl.tcl#L327) | ERROR | - | | MPL | 0049 | [hier_rtlmp.cpp:2431](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/hier_rtlmp.cpp#L2431) | ERROR | - | | MPL | 0050 | [clusterEngine.cpp:236](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/clusterEngine.cpp#L236) | ERROR | - | | MPL | 0051 | [SACoreSoftMacro.cpp:910](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/SACoreSoftMacro.cpp#L910) | ERROR | - | | MPL | 0052 | [SACoreSoftMacro.cpp:1197](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/SACoreSoftMacro.cpp#L1197) | ERROR | - | | MPL | 0053 | [clusterEngine.cpp:1469](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/clusterEngine.cpp#L1469) | ERROR | - | | MPL | 0055 | [hier_rtlmp.cpp:1476](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/hier_rtlmp.cpp#L1476) | WARN | - | | MPL | 0060 | [mpl-util.h:158](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/mpl-util.h#L158) | ERROR | - | | MPL | 0061 | [clusterEngine.cpp:1495](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/clusterEngine.cpp#L1495) | ERROR | - | | MPL | 0062 | [clusterEngine.cpp:2067](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/clusterEngine.cpp#L2067) | INFO | - | | MPL | 0063 | [clusterEngine.cpp:2071](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/clusterEngine.cpp#L2071) | INFO | - | | MPL | 0065 | [clusterEngine.cpp:104](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/clusterEngine.cpp#L104) | ERROR | - | | MPL | 0066 | [object.cpp:571](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/object.cpp#L571) | ERROR | - | | MPL | 0067 | [hier_rtlmp.cpp:1148](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/hier_rtlmp.cpp#L1148) | ERROR | - | | MPL | 0068 | [clusterEngine.cpp:218](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/clusterEngine.cpp#L218) | ERROR | - | | MPL | 0069 | [mpl.tcl:166](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/mpl.tcl#L166) | ERROR | - | | MPL | 0070 | [mpl.tcl:170](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/mpl.tcl#L170) | WARN | - | | MPL | 0071 | [hier_rtlmp.cpp:120](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/hier_rtlmp.cpp#L120) | WARN | - | | MPL | 0072 | [mpl.tcl:361](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/mpl.tcl#L361) | ERROR | - | | MPL | 0073 | [mpl.tcl:376](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/mpl.tcl#L376) | ERROR | - | | MPL | 0074 | [mpl.tcl:111](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/mpl.tcl#L111) | WARN | - | | MPL | 0075 | [mpl.tcl:311](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/mpl.tcl#L311) | WARN | - | | MPL | 0076 | [hier_rtlmp.cpp:298](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/hier_rtlmp.cpp#L298) | INFO | - | | MPL | 0077 | [mpl.tcl:350](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/mpl/src/mpl.tcl#L350) | ERROR | - | | ODB | 0000 | [dbWireCodec.cpp:1477](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbWireCodec.cpp#L1477) | ERROR | - | | ODB | 0002 | [dbDatabase.cpp:956](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbDatabase.cpp#L956) | ERROR | - | | ODB | 0008 | [dbBlock.cpp:2913](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbBlock.cpp#L2913) | ERROR | - | | ODB | 0009 | [dbBlock.cpp:2917](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbBlock.cpp#L2917) | WARN | - | | ODB | 0010 | [dbBlock.cpp:3111](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbBlock.cpp#L3111) | INFO | - | | ODB | 0011 | [dbBlock.cpp:3868](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbBlock.cpp#L3868) | WARN | - | | ODB | 0012 | [odb.tcl:864](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L864) | ERROR | - | | ODB | 0013 | [dbModule.cpp:869](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbModule.cpp#L869) | ERROR | - | | ODB | 0015 | [tmg_conn_w.cpp:64](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/tmg_conn_w.cpp#L64) | INFO | - | | ODB | 0016 | [tmg_conn.cpp:1569](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/tmg_conn.cpp#L1569) | ERROR | - | | ODB | 0017 | [odb.tcl:745](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L745) | ERROR | - | | ODB | 0018 | [tmg_conn.cpp:1792](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/tmg_conn.cpp#L1792) | ERROR | - | | ODB | 0019 | [dbBlock.cpp:3218](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbBlock.cpp#L3218) | WARN | - | | ODB | 0021 | [dbCCSeg.cpp:374](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbCCSeg.cpp#L374) | INFO | - | | ODB | 0022 | [dbCCSeg.cpp:400](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbCCSeg.cpp#L400) | INFO | - | | ODB | 0023 | [dbCCSeg.cpp:735](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbCCSeg.cpp#L735) | ERROR | - | | ODB | 0024 | [dbCapNode.cpp:120](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbCapNode.cpp#L120) | WARN | - | | ODB | 0025 | [dbCapNode.cpp:1042](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbCapNode.cpp#L1042) | INFO | - | | ODB | 0026 | [dbBTerm.cpp:1047](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbBTerm.cpp#L1047) | WARN | - | | ODB | 0027 | [odb.tcl:856](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L856) | ERROR | - | | ODB | 0028 | [odb.tcl:859](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L859) | ERROR | - | | ODB | 0030 | [dbMarkerCategory.cpp:534](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbMarkerCategory.cpp#L534) | ERROR | - | | ODB | 0031 | [dbMarkerCategory.cpp:487](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbMarkerCategory.cpp#L487) | ERROR | - | | ODB | 0034 | [dbITerm.cpp:772](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbITerm.cpp#L772) | WARN | - | | ODB | 0037 | [dbInst.cpp:976](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbInst.cpp#L976) | INFO | - | | ODB | 0038 | [dbInst.cpp:998](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbInst.cpp#L998) | WARN | - | | ODB | 0039 | [dbInst.cpp:1003](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbInst.cpp#L1003) | WARN | - | | ODB | 0040 | [dbInst.cpp:1011](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbInst.cpp#L1011) | WARN | - | | ODB | 0041 | [dbInst.cpp:1016](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbInst.cpp#L1016) | WARN | - | | ODB | 0042 | [dbInst.cpp:1024](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbInst.cpp#L1024) | WARN | - | | ODB | 0043 | [dbInst.cpp:1033](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbInst.cpp#L1033) | WARN | - | | ODB | 0044 | [dbInst.cpp:1153](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbInst.cpp#L1153) | WARN | - | | ODB | 0045 | [dbInst.cpp:1204](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbInst.cpp#L1204) | WARN | - | | ODB | 0046 | [dbInst.cpp:1232](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbInst.cpp#L1232) | WARN | - | | ODB | 0047 | [dbInst.cpp:1692](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbInst.cpp#L1692) | WARN | - | | ODB | 0048 | [dbNet.cpp:774](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbNet.cpp#L774) | WARN | - | | ODB | 0049 | [dbUtil.h:172](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/include/odb/dbUtil.h#L172) | WARN | - | | ODB | 0050 | [dbUtil.h:201](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/include/odb/dbUtil.h#L201) | WARN | - | | ODB | 0051 | [dbUtil.h:235](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/include/odb/dbUtil.h#L235) | WARN | - | | ODB | 0052 | [dbNet.cpp:1855](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbNet.cpp#L1855) | WARN | - | | ODB | 0053 | [dbNet.cpp:1897](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbNet.cpp#L1897) | WARN | - | | ODB | 0054 | [dbRSeg.cpp:511](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbRSeg.cpp#L511) | INFO | - | | ODB | 0055 | [dbMarkerCategory.cpp:582](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbMarkerCategory.cpp#L582) | ERROR | - | | ODB | 0056 | [dbRSeg.cpp:517](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbRSeg.cpp#L517) | INFO | - | | ODB | 0057 | [dbRSeg.cpp:804](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbRSeg.cpp#L804) | WARN | - | | ODB | 0058 | [dbTech.cpp:815](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbTech.cpp#L815) | WARN | - | | ODB | 0059 | [dbTech.cpp:824](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbTech.cpp#L824) | ERROR | - | | ODB | 0060 | [dbTech.cpp:834](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbTech.cpp#L834) | ERROR | - | | ODB | 0061 | [dbTech.cpp:844](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbTech.cpp#L844) | ERROR | - | | ODB | 0062 | [dbWire.cpp:1253](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbWire.cpp#L1253) | WARN | - | | ODB | 0063 | [dbWireCodec.cpp:1217](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbWireCodec.cpp#L1217) | WARN | - | | ODB | 0064 | [dbWireCodec.cpp:1224](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbWireCodec.cpp#L1224) | INFO | - | | ODB | 0065 | [dbWireCodec.cpp:1231](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbWireCodec.cpp#L1231) | INFO | - | | ODB | 0066 | [dbWireCodec.cpp:1243](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbWireCodec.cpp#L1243) | INFO | - | | ODB | 0067 | [dbWireCodec.cpp:1252](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbWireCodec.cpp#L1252) | INFO | - | | ODB | 0068 | [dbWireCodec.cpp:1276](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbWireCodec.cpp#L1276) | INFO | - | | ODB | 0069 | [dbWireCodec.cpp:1288](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbWireCodec.cpp#L1288) | INFO | - | | ODB | 0070 | [dbWireCodec.cpp:1302](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbWireCodec.cpp#L1302) | INFO | - | | ODB | 0071 | [dbWireCodec.cpp:1312](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbWireCodec.cpp#L1312) | INFO | - | | ODB | 0072 | [dbWireCodec.cpp:1322](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbWireCodec.cpp#L1322) | WARN | - | | ODB | 0073 | [dbWireCodec.cpp:1339](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbWireCodec.cpp#L1339) | INFO | - | | ODB | 0074 | [dbWireCodec.cpp:1346](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbWireCodec.cpp#L1346) | INFO | - | | ODB | 0075 | [dbWireCodec.cpp:1360](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbWireCodec.cpp#L1360) | INFO | - | | ODB | 0076 | [dbWireCodec.cpp:1367](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbWireCodec.cpp#L1367) | INFO | - | | ODB | 0077 | [dbWireCodec.cpp:1376](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbWireCodec.cpp#L1376) | INFO | - | | ODB | 0078 | [dbWireCodec.cpp:1383](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbWireCodec.cpp#L1383) | INFO | - | | ODB | 0079 | [dbWireCodec.cpp:1389](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbWireCodec.cpp#L1389) | INFO | - | | ODB | 0080 | [dbWireCodec.cpp:1398](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbWireCodec.cpp#L1398) | INFO | - | | ODB | 0081 | [dbWireCodec.cpp:1412](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbWireCodec.cpp#L1412) | INFO | - | | ODB | 0082 | [dbWireCodec.cpp:1417](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbWireCodec.cpp#L1417) | INFO | - | | ODB | 0083 | [dbWireCodec.cpp:1424](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbWireCodec.cpp#L1424) | ERROR | - | | ODB | 0084 | [dbWireCodec.cpp:1433](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbWireCodec.cpp#L1433) | INFO | - | | ODB | 0085 | [dbWireCodec.cpp:1442](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbWireCodec.cpp#L1442) | INFO | - | | ODB | 0086 | [dbWireCodec.cpp:1450](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbWireCodec.cpp#L1450) | ERROR | - | | ODB | 0087 | [dbWirePathItr.cpp:500](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbWirePathItr.cpp#L500) | WARN | - | | ODB | 0088 | [definBlockage.cpp:33](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definBlockage.cpp#L33) | WARN | - | | ODB | 0089 | [definBlockage.cpp:44](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definBlockage.cpp#L44) | WARN | - | | ODB | 0090 | [definBlockage.cpp:179](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definBlockage.cpp#L179) | WARN | - | | ODB | 0091 | [definBlockage.cpp:200](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definBlockage.cpp#L200) | WARN | - | | ODB | 0092 | [definComponent.cpp:130](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definComponent.cpp#L130) | WARN | - | | ODB | 0093 | [definComponent.cpp:152](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definComponent.cpp#L152) | WARN | - | | ODB | 0094 | [definComponent.cpp:158](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definComponent.cpp#L158) | INFO | - | | ODB | 0095 | [definFill.cpp:23](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definFill.cpp#L23) | WARN | - | | ODB | 0096 | [odb.tcl:1083](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L1083) | ERROR | - | | ODB | 0097 | [definNet.cpp:72](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definNet.cpp#L72) | INFO | - | | ODB | 0098 | [definNet.cpp:86](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definNet.cpp#L86) | WARN | - | | ODB | 0099 | [definNet.cpp:126](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definNet.cpp#L126) | WARN | - | | ODB | 0100 | [definNet.cpp:136](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definNet.cpp#L136) | WARN | - | | ODB | 0101 | [dbMarkerCategory.cpp:598](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbMarkerCategory.cpp#L598) | ERROR | - | | ODB | 0102 | [odb.tcl:1093](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L1093) | ERROR | - | | ODB | 0103 | [definNet.cpp:170](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definNet.cpp#L170) | WARN | - | | ODB | 0104 | [definNet.cpp:254](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definNet.cpp#L254) | WARN | - | | ODB | 0105 | [definNet.cpp:268](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definNet.cpp#L268) | WARN | - | | ODB | 0106 | [definNet.cpp:296](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definNet.cpp#L296) | WARN | - | | ODB | 0107 | [definNet.cpp:444](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definNet.cpp#L444) | WARN | - | | ODB | 0108 | [definNet.cpp:478](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definNet.cpp#L478) | WARN | - | | ODB | 0109 | [definNet.cpp:503](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definNet.cpp#L503) | WARN | - | | ODB | 0110 | [definNet.cpp:520](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definNet.cpp#L520) | WARN | - | | ODB | 0111 | [definNonDefaultRule.cpp:22](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definNonDefaultRule.cpp#L22) | WARN | - | | ODB | 0112 | [definNonDefaultRule.cpp:45](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definNonDefaultRule.cpp#L45) | WARN | - | | ODB | 0113 | [definNonDefaultRule.cpp:62](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definNonDefaultRule.cpp#L62) | WARN | - | | ODB | 0114 | [definNonDefaultRule.cpp:80](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definNonDefaultRule.cpp#L80) | WARN | - | | ODB | 0115 | [definNonDefaultRule.cpp:97](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definNonDefaultRule.cpp#L97) | WARN | - | | ODB | 0116 | [definNonDefaultRule.cpp:105](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definNonDefaultRule.cpp#L105) | WARN | - | | ODB | 0117 | [definPin.cpp:72](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definPin.cpp#L72) | WARN | - | | ODB | 0118 | [definPin.cpp:78](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definPin.cpp#L78) | WARN | - | | ODB | 0119 | [definPin.cpp:169](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definPin.cpp#L169) | WARN | - | | ODB | 0120 | [definPin.cpp:184](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definPin.cpp#L184) | WARN | - | | ODB | 0121 | [definPin.cpp:210](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definPin.cpp#L210) | WARN | - | | ODB | 0122 | [definPin.cpp:350](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definPin.cpp#L350) | WARN | - | | ODB | 0123 | [definPin.cpp:363](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definPin.cpp#L363) | WARN | - | | ODB | 0124 | [dbBlock.cpp:1713](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbBlock.cpp#L1713) | ERROR | - | | ODB | 0125 | [definReader.cpp:1818](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definReader.cpp#L1818) | INFO | - | | ODB | 0126 | [definReader.cpp:1823](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definReader.cpp#L1823) | WARN | - | | ODB | 0127 | [definReader.cpp:1850](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definReader.cpp#L1850) | INFO | - | | ODB | 0128 | [definReader.cpp:384](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definReader.cpp#L384) | INFO | - | | ODB | 0129 | [definReader.cpp:1854](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definReader.cpp#L1854) | WARN | - | | ODB | 0130 | [definReader.cpp:1859](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definReader.cpp#L1859) | INFO | - | | ODB | 0131 | [definReader.cpp:1867](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definReader.cpp#L1867) | INFO | - | | ODB | 0132 | [definReader.cpp:1880](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definReader.cpp#L1880) | INFO | - | | ODB | 0133 | [definReader.cpp:1888](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definReader.cpp#L1888) | INFO | - | | ODB | 0134 | [definReader.cpp:1903](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definReader.cpp#L1903) | INFO | - | | ODB | 0135 | [odb.tcl:1119](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L1119) | ERROR | - | | ODB | 0136 | [odb.tcl:1125](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L1125) | ERROR | - | | ODB | 0137 | [odb.tcl:627](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L627) | ERROR | - | | ODB | 0138 | [odb.tcl:1131](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L1131) | ERROR | - | | ODB | 0139 | [odb.tcl:603](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L603) | ERROR | - | | ODB | 0140 | [odb.tcl:793](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L793) | ERROR | - | | ODB | 0141 | [odb.tcl:1115](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L1115) | ERROR | - | | ODB | 0142 | [odb.tcl:785](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L785) | WARN | - | | ODB | 0143 | [odb.tcl:807](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L807) | ERROR | - | | ODB | 0144 | [odb.tcl:714](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L714) | ERROR | - | | ODB | 0145 | [odb.tcl:777](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L777) | ERROR | - | | ODB | 0146 | [odb.tcl:718](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L718) | ERROR | - | | ODB | 0147 | [odb.tcl:801](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L801) | ERROR | - | | ODB | 0148 | [definReader.cpp:1982](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definReader.cpp#L1982) | WARN | - | | ODB | 0149 | [definReader.cpp:2004](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definReader.cpp#L2004) | WARN | - | | ODB | 0150 | [odb.tcl:1086](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L1086) | ERROR | - | | ODB | 0151 | [checker.cpp:288](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/3dblox/checker.cpp#L288) | WARN | - | | ODB | 0152 | [definRegion.cpp:25](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definRegion.cpp#L25) | WARN | - | | ODB | 0153 | [dbPowerSwitch.cpp:324](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbPowerSwitch.cpp#L324) | ERROR | - | | ODB | 0154 | [dbPowerSwitch.cpp:334](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbPowerSwitch.cpp#L334) | ERROR | - | | ODB | 0155 | [definRow.cpp:79](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definRow.cpp#L79) | WARN | - | | ODB | 0156 | [checker.cpp:330](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/3dblox/checker.cpp#L330) | WARN | - | | ODB | 0157 | [definSNet.cpp:75](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definSNet.cpp#L75) | WARN | - | | ODB | 0158 | [definSNet.cpp:85](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definSNet.cpp#L85) | WARN | - | | ODB | 0159 | [definSNet.cpp:151](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definSNet.cpp#L151) | WARN | - | | ODB | 0160 | [definSNet.cpp:181](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definSNet.cpp#L181) | WARN | - | | ODB | 0161 | [definSNet.cpp:217](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definSNet.cpp#L217) | WARN | - | | ODB | 0162 | [definSNet.cpp:236](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definSNet.cpp#L236) | WARN | - | | ODB | 0163 | [definSNet.cpp:381](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definSNet.cpp#L381) | WARN | - | | ODB | 0164 | [definSNet.cpp:448](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definSNet.cpp#L448) | WARN | - | | ODB | 0165 | [definTracks.cpp:37](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definTracks.cpp#L37) | WARN | - | | ODB | 0166 | [definVia.cpp:26](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definVia.cpp#L26) | WARN | - | | ODB | 0167 | [definVia.cpp:40](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definVia.cpp#L40) | WARN | - | | ODB | 0168 | [definVia.cpp:80](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definVia.cpp#L80) | WARN | - | | ODB | 0169 | [definVia.cpp:89](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definVia.cpp#L89) | WARN | - | | ODB | 0170 | [definVia.cpp:98](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definVia.cpp#L98) | WARN | - | | ODB | 0171 | [definVia.cpp:207](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definVia.cpp#L207) | WARN | - | | ODB | 0172 | [dbInst.cpp:1674](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbInst.cpp#L1674) | WARN | - | | ODB | 0173 | [defout_impl.cpp:978](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defout/defout_impl.cpp#L978) | WARN | - | | ODB | 0174 | [defout_impl.cpp:1720](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defout/defout_impl.cpp#L1720) | WARN | - | | ODB | 0175 | [lefin.cpp:188](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L188) | WARN | - | | ODB | 0176 | [lefin.cpp:212](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L212) | WARN | - | | ODB | 0177 | [lefin.cpp:405](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L405) | WARN | - | | ODB | 0178 | [lefin.cpp:426](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L426) | WARN | - | | ODB | 0179 | [lefin.cpp:521](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L521) | ERROR | - | | ODB | 0180 | [lefin.cpp:601](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L601) | WARN | - | | ODB | 0181 | [lefin.cpp:623](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L623) | WARN | - | | ODB | 0182 | [lefin.cpp:632](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L632) | WARN | - | | ODB | 0183 | [lefin.cpp:889](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L889) | ERROR | - | | ODB | 0184 | [lefin.cpp:1284](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L1284) | WARN | - | | ODB | 0185 | [lefin.cpp:1294](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L1294) | WARN | - | | ODB | 0186 | [lefin.cpp:1318](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L1318) | WARN | - | | ODB | 0187 | [lefin.cpp:1374](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L1374) | WARN | - | | ODB | 0188 | [lefin.cpp:1385](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L1385) | WARN | - | | ODB | 0189 | [lefin.cpp:1428](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L1428) | WARN | - | | ODB | 0190 | [lefin.cpp:1436](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L1436) | WARN | - | | ODB | 0191 | [lefin.cpp:1461](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L1461) | WARN | - | | ODB | 0192 | [lefin.cpp:1474](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L1474) | WARN | - | | ODB | 0193 | [lefin.cpp:1488](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L1488) | WARN | - | | ODB | 0194 | [lefin.cpp:1555](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L1555) | WARN | - | | ODB | 0195 | [lefin.cpp:1582](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L1582) | WARN | - | | ODB | 0196 | [lefin.cpp:1603](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L1603) | WARN | - | | ODB | 0197 | [lefin.cpp:1624](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L1624) | WARN | - | | ODB | 0198 | [lefin.cpp:1644](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L1644) | WARN | - | | ODB | 0199 | [lefin.cpp:1673](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L1673) | WARN | - | | ODB | 0200 | [lefin.cpp:1690](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L1690) | WARN | - | | ODB | 0201 | [lefin.cpp:1707](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L1707) | WARN | - | | ODB | 0202 | [lefin.cpp:1725](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L1725) | WARN | - | | ODB | 0203 | [lefin.cpp:1870](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L1870) | WARN | - | | ODB | 0204 | [lefin.cpp:1876](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L1876) | WARN | - | | ODB | 0205 | [lefin.cpp:1917](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L1917) | WARN | - | | ODB | 0206 | [checker.cpp:277](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/3dblox/checker.cpp#L277) | WARN | - | | ODB | 0207 | [lefin.cpp:1992](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L1992) | WARN | - | | ODB | 0208 | [lefin.cpp:1848](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L1848) | WARN | - | | ODB | 0209 | [lefin.cpp:2048](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L2048) | WARN | - | | ODB | 0210 | [lefin.cpp:2079](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L2079) | WARN | - | | ODB | 0211 | [lefin.cpp:2095](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L2095) | WARN | - | | ODB | 0212 | [lefin.cpp:2104](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L2104) | WARN | - | | ODB | 0213 | [lefin.cpp:2112](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L2112) | WARN | - | | ODB | 0214 | [lefin.cpp:2167](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L2167) | WARN | - | | ODB | 0215 | [lefin.cpp:2177](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L2177) | WARN | - | | ODB | 0216 | [lefin.cpp:2208](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L2208) | WARN | - | | ODB | 0217 | [lefin.cpp:2227](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L2227) | WARN | - | | ODB | 0218 | [lefin.cpp:2237](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L2237) | WARN | - | | ODB | 0219 | [dbPowerSwitch.cpp:351](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbPowerSwitch.cpp#L351) | ERROR | - | | ODB | 0220 | [dbPowerSwitch.cpp:361](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbPowerSwitch.cpp#L361) | ERROR | - | | ODB | 0221 | [lefin.cpp:2306](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L2306) | INFO | - | | ODB | 0222 | [lefin.cpp:2314](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L2314) | INFO | - | | ODB | 0223 | [odb.tcl:688](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L688) | ERROR | - | | ODB | 0224 | [dbMarkerCategory.cpp:628](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbMarkerCategory.cpp#L628) | WARN | - | | ODB | 0225 | [dbMarkerCategory.cpp:647](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbMarkerCategory.cpp#L647) | ERROR | - | | ODB | 0226 | [dbMarkerCategory.cpp:653](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbMarkerCategory.cpp#L653) | ERROR | - | | ODB | 0227 | [dbMarkerCategory.cpp:660](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbMarkerCategory.cpp#L660) | ERROR | - | | ODB | 0228 | [lefin.cpp:2463](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L2463) | WARN | - | | ODB | 0229 | [lefin.cpp:2468](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L2468) | WARN | - | | ODB | 0230 | [lefin.cpp:2498](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L2498) | WARN | - | | ODB | 0231 | [lefin.cpp:2504](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L2504) | WARN | - | | ODB | 0232 | [dbBlock.cpp:3395](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbBlock.cpp#L3395) | WARN | - | | ODB | 0233 | [dbMarkerCategory.cpp:745](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbMarkerCategory.cpp#L745) | WARN | - | | ODB | 0234 | [dbMarkerCategory.cpp:700](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbMarkerCategory.cpp#L700) | WARN | - | | ODB | 0235 | [dbMarkerCategory.cpp:712](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbMarkerCategory.cpp#L712) | WARN | - | | ODB | 0236 | [dbMarkerCategory.cpp:724](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbMarkerCategory.cpp#L724) | WARN | - | | ODB | 0237 | [dbMarkerCategory.cpp:736](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbMarkerCategory.cpp#L736) | WARN | - | | ODB | 0238 | [dbMarkerCategory.cpp:509](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbMarkerCategory.cpp#L509) | ERROR | - | | ODB | 0239 | [dbBlock.cpp:1831](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbBlock.cpp#L1831) | ERROR | - | | ODB | 0240 | [reader.cpp:529](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/reader.cpp#L529) | WARN | - | | ODB | 0241 | [create_box.cpp:150](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/create_box.cpp#L150) | WARN | - | | ODB | 0242 | [create_box.cpp:180](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/create_box.cpp#L180) | WARN | - | | ODB | 0243 | [create_box.cpp:183](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/create_box.cpp#L183) | INFO | - | | ODB | 0244 | [create_box.cpp:219](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/create_box.cpp#L219) | WARN | - | | ODB | 0245 | [create_box.cpp:249](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/create_box.cpp#L249) | WARN | - | | ODB | 0246 | [lefin.cpp:2387](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L2387) | ERROR | - | | ODB | 0247 | [definReader.cpp:959](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definReader.cpp#L959) | WARN | - | | ODB | 0248 | [definReader.cpp:495](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definReader.cpp#L495) | WARN | - | | ODB | 0249 | [definReader.cpp:1617](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definReader.cpp#L1617) | WARN | - | | ODB | 0250 | [definReader.cpp:1842](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definReader.cpp#L1842) | ERROR | - | | ODB | 0251 | [definReader.cpp:1845](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definReader.cpp#L1845) | ERROR | - | | ODB | 0252 | [definReader.cpp:1863](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definReader.cpp#L1863) | INFO | - | | ODB | 0253 | [definReader.cpp:1875](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definReader.cpp#L1875) | INFO | - | | ODB | 0254 | [definReader.cpp:1896](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definReader.cpp#L1896) | INFO | - | | ODB | 0255 | [dbMarker.cpp:427](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbMarker.cpp#L427) | WARN | - | | ODB | 0256 | [dbMarker.cpp:472](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbMarker.cpp#L472) | WARN | - | | ODB | 0257 | [dbMarker.cpp:501](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbMarker.cpp#L501) | WARN | - | | ODB | 0258 | [dbMarker.cpp:510](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbMarker.cpp#L510) | WARN | - | | ODB | 0259 | [dbMarker.cpp:519](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbMarker.cpp#L519) | WARN | - | | ODB | 0260 | [definReader.cpp:72](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definReader.cpp#L72) | WARN | - | | ODB | 0261 | [odb.tcl:740](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L740) | ERROR | - | | ODB | 0262 | [dbMarker.cpp:528](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbMarker.cpp#L528) | WARN | - | | ODB | 0263 | [dbMarker.cpp:771](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbMarker.cpp#L771) | WARN | - | | ODB | 0264 | [dbMarker.cpp:534](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbMarker.cpp#L534) | WARN | - | | ODB | 0265 | [dbMarker.cpp:539](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbMarker.cpp#L539) | WARN | - | | ODB | 0266 | [dbMarker.cpp:440](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbMarker.cpp#L440) | WARN | - | | ODB | 0267 | [dbObject.cpp:421](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbObject.cpp#L421) | ERROR | - | | ODB | 0268 | [dbMarkerCategory.cpp:274](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbMarkerCategory.cpp#L274) | ERROR | - | | ODB | 0269 | [dbMarkerCategory.cpp:463](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbMarkerCategory.cpp#L463) | ERROR | - | | ODB | 0270 | [reader.cpp:520](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/reader.cpp#L520) | WARN | - | | ODB | 0271 | [definReader.cpp:1992](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definReader.cpp#L1992) | WARN | - | | ODB | 0272 | [dbBlock.cpp:3612](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbBlock.cpp#L3612) | ERROR | - | | ODB | 0273 | [checker.cpp:405](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/3dblox/checker.cpp#L405) | WARN | - | | ODB | 0274 | [create_box.cpp:38](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/create_box.cpp#L38) | WARN | - | | ODB | 0275 | [definReader.cpp:715](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definReader.cpp#L715) | WARN | - | | ODB | 0276 | [create_box.cpp:254](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/create_box.cpp#L254) | INFO | - | | ODB | 0277 | [lefin.cpp:2331](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L2331) | WARN | - | | ODB | 0278 | [dbMarker.cpp:380](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbMarker.cpp#L380) | ERROR | - | | ODB | 0279 | [lefin.cpp:782](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L782) | WARN | - | | ODB | 0280 | [lefin.cpp:2347](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L2347) | WARN | - | | ODB | 0281 | [dbMarkerCategory.cpp:441](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbMarkerCategory.cpp#L441) | ERROR | - | | ODB | 0282 | [dbTechLayer.cpp:1841](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbTechLayer.cpp#L1841) | ERROR | - | | ODB | 0283 | [cdl.cpp:151](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/cdl/cdl.cpp#L151) | ERROR | - | | ODB | 0284 | [cdl.cpp:121](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/cdl/cdl.cpp#L121) | WARN | - | | ODB | 0285 | [cdl.cpp:125](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/cdl/cdl.cpp#L125) | WARN | - | | ODB | 0286 | [cdl.cpp:139](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/cdl/cdl.cpp#L139) | WARN | - | | ODB | 0287 | [cdl.cpp:200](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/cdl/cdl.cpp#L200) | ERROR | - | | ODB | 0288 | [lefin.cpp:2442](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L2442) | ERROR | - | | ODB | 0289 | [lefin.cpp:2520](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L2520) | ERROR | - | | ODB | 0290 | [dbMarker.cpp:671](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbMarker.cpp#L671) | ERROR | - | | ODB | 0291 | [dbMarkerCategory.cpp:618](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbMarkerCategory.cpp#L618) | ERROR | - | | ODB | 0292 | [lefin.cpp:2480](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L2480) | ERROR | - | | ODB | 0293 | [definReader.cpp:1456](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definReader.cpp#L1456) | WARN | - | | ODB | 0294 | [dbMarker.cpp:457](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbMarker.cpp#L457) | WARN | - | | ODB | 0295 | [dbMarker.cpp:262](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbMarker.cpp#L262) | ERROR | - | | ODB | 0296 | [dbMarker.cpp:488](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbMarker.cpp#L488) | WARN | - | | ODB | 0297 | [dbModule.cpp:219](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbModule.cpp#L219) | ERROR | - | | ODB | 0298 | [dbModule.cpp:425](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbModule.cpp#L425) | ERROR | - | | ODB | 0299 | [definVia.cpp:235](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definVia.cpp#L235) | ERROR | - | | ODB | 0300 | [definVia.cpp:245](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definVia.cpp#L245) | ERROR | - | | ODB | 0301 | [definVia.cpp:255](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definVia.cpp#L255) | ERROR | - | | ODB | 0302 | [definVia.cpp:271](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definVia.cpp#L271) | ERROR | - | | ODB | 0303 | [util.cpp:286](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/util.cpp#L286) | INFO | - | | ODB | 0304 | [definGroup.cpp:23](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definGroup.cpp#L23) | WARN | - | | ODB | 0305 | [definGroup.cpp:36](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definGroup.cpp#L36) | WARN | - | | ODB | 0306 | [definGroup.cpp:61](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definGroup.cpp#L61) | WARN | - | | ODB | 0307 | [dbBlock.cpp:3246](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbBlock.cpp#L3246) | ERROR | - | | ODB | 0308 | [odb.tcl:13](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L13) | ERROR | - | | ODB | 0309 | [odb.tcl:18](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L18) | ERROR | - | | ODB | 0310 | [odb.tcl:30](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L30) | ERROR | - | | ODB | 0311 | [odb.tcl:38](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L38) | ERROR | - | | ODB | 0312 | [odb.tcl:41](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L41) | ERROR | - | | ODB | 0313 | [odb.tcl:50](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L50) | ERROR | - | | ODB | 0314 | [odb.tcl:62](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L62) | ERROR | - | | ODB | 0315 | [odb.tcl:221](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L221) | ERROR | - | | ODB | 0316 | [odb.tcl:229](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L229) | ERROR | - | | ODB | 0317 | [odb.tcl:236](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L236) | ERROR | - | | ODB | 0318 | [odb.tcl:241](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L241) | ERROR | - | | ODB | 0319 | [odb.tcl:248](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L248) | ERROR | - | | ODB | 0320 | [odb.tcl:262](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L262) | ERROR | - | | ODB | 0321 | [odb.tcl:267](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L267) | ERROR | - | | ODB | 0322 | [odb.tcl:270](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L270) | ERROR | - | | ODB | 0323 | [odb.tcl:284](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L284) | ERROR | - | | ODB | 0324 | [odb.tcl:289](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L289) | ERROR | - | | ODB | 0325 | [odb.tcl:292](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L292) | ERROR | - | | ODB | 0326 | [odb.tcl:304](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L304) | ERROR | - | | ODB | 0327 | [odb.tcl:309](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L309) | ERROR | - | | ODB | 0328 | [odb.tcl:314](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L314) | ERROR | - | | ODB | 0329 | [odb.tcl:320](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L320) | ERROR | - | | ODB | 0330 | [odb.tcl:323](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L323) | ERROR | - | | ODB | 0331 | [odb.tcl:326](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L326) | ERROR | - | | ODB | 0332 | [odb.tcl:338](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L338) | ERROR | - | | ODB | 0333 | [odb.tcl:343](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L343) | ERROR | - | | ODB | 0334 | [odb.tcl:348](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L348) | ERROR | - | | ODB | 0335 | [odb.tcl:354](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L354) | ERROR | - | | ODB | 0336 | [odb.tcl:357](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L357) | ERROR | - | | ODB | 0337 | [odb.tcl:360](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L360) | ERROR | - | | ODB | 0338 | [odb.tcl:377](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L377) | ERROR | - | | ODB | 0339 | [odb.tcl:382](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L382) | ERROR | - | | ODB | 0340 | [odb.tcl:385](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L385) | ERROR | - | | ODB | 0341 | [odb.tcl:390](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L390) | ERROR | - | | ODB | 0342 | [odb.tcl:397](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L397) | ERROR | - | | ODB | 0343 | [odb.tcl:404](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L404) | ERROR | - | | ODB | 0344 | [odb.tcl:407](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L407) | ERROR | - | | ODB | 0345 | [odb.tcl:426](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L426) | ERROR | - | | ODB | 0346 | [odb.tcl:431](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L431) | ERROR | - | | ODB | 0347 | [odb.tcl:434](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L434) | ERROR | - | | ODB | 0348 | [odb.tcl:439](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L439) | ERROR | - | | ODB | 0349 | [odb.tcl:443](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L443) | ERROR | - | | ODB | 0350 | [odb.tcl:450](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L450) | ERROR | - | | ODB | 0351 | [odb.tcl:457](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L457) | ERROR | - | | ODB | 0352 | [odb.tcl:460](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L460) | ERROR | - | | ODB | 0353 | [odb.tcl:473](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L473) | ERROR | - | | ODB | 0354 | [odb.tcl:492](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L492) | ERROR | - | | ODB | 0355 | [odb.tcl:559](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L559) | ERROR | - | | ODB | 0356 | [lefin.cpp:2363](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L2363) | WARN | - | | ODB | 0357 | [cdl.cpp:194](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/cdl/cdl.cpp#L194) | WARN | - | | ODB | 0358 | [dbBlock.cpp:2536](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbBlock.cpp#L2536) | ERROR | - | | ODB | 0359 | [dbInst.cpp:411](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbInst.cpp#L411) | ERROR | - | | ODB | 0360 | [dbInst.cpp:510](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbInst.cpp#L510) | ERROR | - | | ODB | 0361 | [lefin.cpp:2377](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L2377) | WARN | - | | ODB | 0362 | [dbInst.cpp:1520](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbInst.cpp#L1520) | ERROR | - | | ODB | 0363 | [odb.tcl:620](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L620) | ERROR | - | | ODB | 0364 | [dbNet.cpp:2232](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbNet.cpp#L2232) | ERROR | - | | ODB | 0365 | [odb.tcl:659](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L659) | ERROR | - | | ODB | 0366 | [odb.tcl:674](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L674) | ERROR | - | | ODB | 0367 | [dbModule.cpp:232](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbModule.cpp#L232) | ERROR | - | | ODB | 0368 | [dbInst.cpp:1145](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbInst.cpp#L1145) | ERROR | - | | ODB | 0369 | [dbITerm.cpp:314](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbITerm.cpp#L314) | ERROR | - | | ODB | 0370 | [dbITerm.cpp:465](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbITerm.cpp#L465) | ERROR | - | | ODB | 0371 | [dbModule.cpp:281](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbModule.cpp#L281) | ERROR | - | | ODB | 0372 | [dbITerm.cpp:481](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbITerm.cpp#L481) | ERROR | - | | ODB | 0373 | [dbITerm.cpp:322](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbITerm.cpp#L322) | ERROR | - | | ODB | 0374 | [dbBTerm.cpp:806](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbBTerm.cpp#L806) | ERROR | - | | ODB | 0375 | [dbBTerm.cpp:466](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbBTerm.cpp#L466) | ERROR | - | | ODB | 0376 | [dbBTerm.cpp:657](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbBTerm.cpp#L657) | ERROR | - | | ODB | 0377 | [dbBTerm.cpp:446](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbBTerm.cpp#L446) | ERROR | - | | ODB | 0378 | [dbBlock.cpp:3501](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbBlock.cpp#L3501) | WARN | - | | ODB | 0379 | [dbGlobalConnect.cpp:306](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbGlobalConnect.cpp#L306) | WARN | - | | ODB | 0380 | [dbGlobalConnect.cpp:340](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbGlobalConnect.cpp#L340) | WARN | - | | ODB | 0381 | [dbBlock.cpp:3473](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbBlock.cpp#L3473) | ERROR | - | | ODB | 0382 | [dbBlock.cpp:3477](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbBlock.cpp#L3477) | WARN | - | | ODB | 0383 | [dbBlock.cpp:3550](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbBlock.cpp#L3550) | WARN | - | | ODB | 0384 | [dbGlobalConnect.cpp:252](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbGlobalConnect.cpp#L252) | ERROR | - | | ODB | 0385 | [dbChip.cpp:714](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbChip.cpp#L714) | ERROR | - | | ODB | 0386 | [util.cpp:267](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/util.cpp#L267) | WARN | - | | ODB | 0387 | [definNonDefaultRule.cpp:196](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definNonDefaultRule.cpp#L196) | WARN | - | | ODB | 0388 | [lefin.cpp:790](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L790) | INFO | - | | ODB | 0389 | [dbModule.cpp:440](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbModule.cpp#L440) | ERROR | - | | ODB | 0390 | [tmg_conn.cpp:1127](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/tmg_conn.cpp#L1127) | ERROR | - | | ODB | 0391 | [tmg_conn.cpp:1157](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/tmg_conn.cpp#L1157) | ERROR | - | | ODB | 0392 | [tmg_conn.cpp:1193](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/tmg_conn.cpp#L1193) | ERROR | - | | ODB | 0393 | [tmg_conn.cpp:1652](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/tmg_conn.cpp#L1652) | ERROR | - | | ODB | 0394 | [lefin.cpp:1806](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L1806) | INFO | - | | ODB | 0395 | [tmg_conn.cpp:1467](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/tmg_conn.cpp#L1467) | WARN | - | | ODB | 0396 | [tmg_conn.cpp:1549](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/tmg_conn.cpp#L1549) | WARN | - | | ODB | 0397 | [dbITerm.cpp:418](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbITerm.cpp#L418) | ERROR | - | | ODB | 0398 | [dbJournal.cpp:155](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbJournal.cpp#L155) | CRITICAL | - | | ODB | 0399 | [dbJournal.cpp:251](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbJournal.cpp#L251) | CRITICAL | - | | ODB | 0400 | [lefin.cpp:1949](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L1949) | WARN | - | | ODB | 0401 | [lefin.cpp:1960](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L1960) | WARN | - | | ODB | 0402 | [lefin.cpp:1970](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L1970) | WARN | - | | ODB | 0403 | [dbBlock.cpp:3572](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbBlock.cpp#L3572) | INFO | - | | ODB | 0404 | [checker.cpp:516](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/3dblox/checker.cpp#L516) | WARN | - | | ODB | 0408 | [dbJournal.cpp:2556](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbJournal.cpp#L2556) | CRITICAL | - | | ODB | 0409 | [dbJournal.cpp:2669](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbJournal.cpp#L2669) | CRITICAL | - | | ODB | 0410 | [dbJournal.cpp:2687](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbJournal.cpp#L2687) | CRITICAL | - | | ODB | 0411 | [dbJournal.cpp:2707](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbJournal.cpp#L2707) | CRITICAL | - | | ODB | 0412 | [dbJournal.cpp:2725](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbJournal.cpp#L2725) | CRITICAL | - | | ODB | 0413 | [dbJournal.cpp:2745](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbJournal.cpp#L2745) | CRITICAL | - | | ODB | 0414 | [dbTrackGrid.cpp:287](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbTrackGrid.cpp#L287) | ERROR | - | | ODB | 0415 | [dbTrackGrid.cpp:300](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbTrackGrid.cpp#L300) | ERROR | - | | ODB | 0416 | [dbTrackGrid.cpp:306](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbTrackGrid.cpp#L306) | ERROR | - | | ODB | 0417 | [dbJournal.cpp:2163](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbJournal.cpp#L2163) | CRITICAL | - | | ODB | 0418 | [dbTrackGrid.cpp:276](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbTrackGrid.cpp#L276) | ERROR | - | | ODB | 0419 | [dbJournal.cpp:260](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbJournal.cpp#L260) | CRITICAL | - | | ODB | 0420 | [tmg_conn.cpp:524](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/tmg_conn.cpp#L524) | ERROR | - | | ODB | 0421 | [definReader.cpp:2002](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definReader.cpp#L2002) | ERROR | - | | ODB | 0422 | [dbChip.cpp:726](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbChip.cpp#L726) | ERROR | - | | ODB | 0423 | [lefin.cpp:607](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L607) | WARN | - | | ODB | 0424 | [dbJournal.cpp:2592](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbJournal.cpp#L2592) | CRITICAL | - | | ODB | 0425 | [definComponentMaskShift.cpp:15](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definComponentMaskShift.cpp#L15) | WARN | - | | ODB | 0426 | [dbJournalLog.cpp:35](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbJournalLog.cpp#L35) | CRITICAL | - | | ODB | 0427 | [dbJournalLog.cpp:330](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbJournalLog.cpp#L330) | ERROR | - | | ODB | 0428 | [dbBlock.cpp:1787](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbBlock.cpp#L1787) | ERROR | - | | ODB | 0429 | [dbJournalLog.cpp:246](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbJournalLog.cpp#L246) | ERROR | - | | ODB | 0430 | [dbBox.cpp:704](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbBox.cpp#L704) | ERROR | - | | ODB | 0431 | [dbMaster.cpp:720](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbMaster.cpp#L720) | ERROR | - | | ODB | 0432 | [dbDatabase.cpp:794](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbDatabase.cpp#L794) | ERROR | - | | ODB | 0433 | [dbITerm.cpp:329](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbITerm.cpp#L329) | ERROR | - | | ODB | 0434 | [dbBox.cpp:400](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbBox.cpp#L400) | ERROR | - | | ODB | 0435 | [dbBox.cpp:682](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbBox.cpp#L682) | ERROR | - | | ODB | 0436 | [dbInst.cpp:1436](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbInst.cpp#L1436) | ERROR | - | | ODB | 0437 | [definReader.cpp:1000](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definReader.cpp#L1000) | WARN | - | | ODB | 0438 | [dbJournalLog.cpp:273](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbJournalLog.cpp#L273) | CRITICAL | - | | ODB | 0439 | [odb.tcl:574](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L574) | ERROR | - | | ODB | 0440 | [dbITerm.cpp:304](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbITerm.cpp#L304) | ERROR | - | | ODB | 0441 | [dbJournal.cpp:1927](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbJournal.cpp#L1927) | CRITICAL | - | | ODB | 0442 | [dbJournal.cpp:2277](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbJournal.cpp#L2277) | CRITICAL | - | | ODB | 0443 | [dbJournal.cpp:2384](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbJournal.cpp#L2384) | CRITICAL | - | | ODB | 0444 | [dbJournal.cpp:2465](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbJournal.cpp#L2465) | CRITICAL | - | | ODB | 0445 | [dbJournal.cpp:2504](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbJournal.cpp#L2504) | CRITICAL | - | | ODB | 0446 | [dbITerm.cpp:146](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbITerm.cpp#L146) | CRITICAL | - | | ODB | 0447 | [gdsout.cpp:37](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/gdsout/gdsout.cpp#L37) | ERROR | - | | ODB | 0448 | [gdsout.cpp:67](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/gdsout/gdsout.cpp#L67) | ERROR | - | | ODB | 0449 | [gdsout.cpp:131](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/gdsout/gdsout.cpp#L131) | ERROR | - | | ODB | 0450 | [gdsin.cpp:38](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/gdsin/gdsin.cpp#L38) | ERROR | - | | ODB | 0451 | [gdsin.cpp:55](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/gdsin/gdsin.cpp#L55) | ERROR | - | | ODB | 0452 | [gdsin.cpp:66](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/gdsin/gdsin.cpp#L66) | ERROR | - | | ODB | 0453 | [dbModule.cpp:646](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbModule.cpp#L646) | WARN | - | | ODB | 0454 | [dbModule.cpp:661](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbModule.cpp#L661) | WARN | - | | ODB | 0455 | [dbModInst.cpp:581](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbModInst.cpp#L581) | ERROR | - | | ODB | 0456 | [dbModule.cpp:743](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbModule.cpp#L743) | ERROR | - | | ODB | 0457 | [dbModule.cpp:764](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbModule.cpp#L764) | ERROR | - | | ODB | 0458 | [dbModule.cpp:794](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbModule.cpp#L794) | ERROR | - | | ODB | 0459 | [dbJournalLog.cpp:293](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbJournalLog.cpp#L293) | CRITICAL | - | | ODB | 0460 | [dbModule.cpp:1008](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbModule.cpp#L1008) | ERROR | - | | ODB | 0461 | [dbModule.cpp:1032](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbModule.cpp#L1032) | ERROR | - | | ODB | 0462 | [dbModule.cpp:1064](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbModule.cpp#L1064) | ERROR | - | | ODB | 0463 | [checker.cpp:441](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/3dblox/checker.cpp#L441) | WARN | - | | ODB | 0464 | [checker.cpp:355](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/3dblox/checker.cpp#L355) | WARN | - | | ODB | 0465 | [definSNet.cpp:166](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definSNet.cpp#L166) | WARN | - | | ODB | 0466 | [dbModInst.cpp:723](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbModInst.cpp#L723) | ERROR | - | | ODB | 0467 | [dbJournal.cpp:2424](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbJournal.cpp#L2424) | CRITICAL | - | | ODB | 0468 | [dbModule.cpp:781](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbModule.cpp#L781) | ERROR | - | | ODB | 0469 | [definNet.cpp:339](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/defin/definNet.cpp#L339) | WARN | - | | ODB | 0470 | [dbModule.cpp:633](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbModule.cpp#L633) | WARN | - | | ODB | 0471 | [dbModInst.cpp:663](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbModInst.cpp#L663) | ERROR | - | | ODB | 0472 | [odb.tcl:1235](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L1235) | ERROR | - | | ODB | 0473 | [odb.tcl:1219](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L1219) | ERROR | - | | ODB | 0474 | [odb.tcl:1223](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L1223) | ERROR | - | | ODB | 0475 | [odb.tcl:1180](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L1180) | ERROR | - | | ODB | 0476 | [dbModule.cpp:1142](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbModule.cpp#L1142) | ERROR | - | | ODB | 0479 | [dbChipNet.cpp:130](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbChipNet.cpp#L130) | ERROR | - | | ODB | 0480 | [dbChipNet.cpp:139](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbChipNet.cpp#L139) | ERROR | - | | ODB | 0482 | [dbUtil.h:206](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/include/odb/dbUtil.h#L206) | WARN | - | | ODB | 0483 | [dbUtil.h:261](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/include/odb/dbUtil.h#L261) | WARN | - | | ODB | 0484 | [dbNet.cpp:2692](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbNet.cpp#L2692) | WARN | - | | ODB | 0485 | [dbNet.cpp:2698](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbNet.cpp#L2698) | WARN | - | | ODB | 0486 | [dbNet.cpp:2728](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbNet.cpp#L2728) | WARN | - | | ODB | 0487 | [dbNet.cpp:2734](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbNet.cpp#L2734) | WARN | - | | ODB | 0488 | [dbNet.cpp:2708](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbNet.cpp#L2708) | WARN | - | | ODB | 0489 | [dbNet.cpp:2714](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbNet.cpp#L2714) | WARN | - | | ODB | 0490 | [dbNet.cpp:2744](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbNet.cpp#L2744) | WARN | - | | ODB | 0491 | [dbNet.cpp:2750](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbNet.cpp#L2750) | WARN | - | | ODB | 0492 | [dbModNet.cpp:338](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbModNet.cpp#L338) | ERROR | - | | ODB | 0493 | [dbNet.cpp:2829](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbNet.cpp#L2829) | ERROR | - | | ODB | 0494 | [dbModNet.cpp:619](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbModNet.cpp#L619) | ERROR | - | | ODB | 0495 | [dbModNet.cpp:211](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbModNet.cpp#L211) | ERROR | - | | ODB | 0496 | [dbSwapMasterSanityChecker.cpp:56](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbSwapMasterSanityChecker.cpp#L56) | INFO | - | | ODB | 0497 | [dbSwapMasterSanityChecker.cpp:58](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbSwapMasterSanityChecker.cpp#L58) | INFO | - | | ODB | 0498 | [dbSwapMasterSanityChecker.cpp:80](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbSwapMasterSanityChecker.cpp#L80) | WARN | - | | ODB | 0499 | [dbSwapMasterSanityChecker.cpp:67](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbSwapMasterSanityChecker.cpp#L67) | ERROR | - | | ODB | 0500 | [dbBlock.cpp:1718](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbBlock.cpp#L1718) | ERROR | - | | ODB | 0501 | [dbBlock.cpp:1724](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbBlock.cpp#L1724) | ERROR | - | | ODB | 0502 | [dbBlock.cpp:1730](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbBlock.cpp#L1730) | ERROR | - | | ODB | 0503 | [dbBlock.cpp:1736](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbBlock.cpp#L1736) | ERROR | - | | ODB | 0504 | [dbBlock.cpp:1742](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbBlock.cpp#L1742) | ERROR | - | | ODB | 0505 | [dbInst.cpp:1535](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbInst.cpp#L1535) | ERROR | - | | ODB | 0506 | [dbChipInst.cpp:230](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbChipInst.cpp#L230) | ERROR | - | | ODB | 0507 | [dbChipInst.cpp:238](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbChipInst.cpp#L238) | ERROR | - | | ODB | 0508 | [dbSwapMasterSanityChecker.cpp:86](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbSwapMasterSanityChecker.cpp#L86) | WARN | - | | ODB | 0509 | [dbChipRegion.cpp:209](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbChipRegion.cpp#L209) | ERROR | - | | ODB | 0510 | [dbChipConn.cpp:186](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbChipConn.cpp#L186) | ERROR | - | | ODB | 0511 | [dbChipConn.cpp:212](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbChipConn.cpp#L212) | ERROR | - | | ODB | 0512 | [dbSwapMasterSanityChecker.cpp:39](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbSwapMasterSanityChecker.cpp#L39) | ERROR | - | | ODB | 0513 | [dbChipBump.cpp:160](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbChipBump.cpp#L160) | ERROR | - | | ODB | 0514 | [dbChipInst.cpp:242](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbChipInst.cpp#L242) | ERROR | - | | ODB | 0515 | [dbChipConn.cpp:219](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbChipConn.cpp#L219) | ERROR | - | | ODB | 0516 | [3dblox.cpp:73](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/3dblox/3dblox.cpp#L73) | ERROR | - | | ODB | 0517 | [dbChipConn.cpp:226](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbChipConn.cpp#L226) | ERROR | - | | ODB | 0518 | [dbChipConn.cpp:235](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbChipConn.cpp#L235) | ERROR | - | | ODB | 0519 | [3dblox.cpp:674](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/3dblox/3dblox.cpp#L674) | ERROR | - | | ODB | 0520 | [dbChipRegion.cpp:218](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbChipRegion.cpp#L218) | ERROR | - | | ODB | 0521 | [baseParser.cpp:177](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/3dblox/baseParser.cpp#L177) | ERROR | - | | ODB | 0522 | [3dblox.cpp:752](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/3dblox/3dblox.cpp#L752) | ERROR | - | | ODB | 0523 | [3dblox.cpp:763](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/3dblox/3dblox.cpp#L763) | ERROR | - | | ODB | 0524 | [3dblox.cpp:727](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/3dblox/3dblox.cpp#L727) | ERROR | - | | ODB | 0525 | [3dblox.cpp:688](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/3dblox/3dblox.cpp#L688) | ERROR | - | | ODB | 0526 | [3dblox.cpp:68](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/3dblox/3dblox.cpp#L68) | ERROR | - | | ODB | 0527 | [3dblox.cpp:392](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/3dblox/3dblox.cpp#L392) | ERROR | - | | ODB | 0528 | [3dblox.cpp:535](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/3dblox/3dblox.cpp#L535) | ERROR | - | | ODB | 0529 | [3dblox.cpp:409](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/3dblox/3dblox.cpp#L409) | ERROR | - | | ODB | 0530 | [3dblox.cpp:445](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/3dblox/3dblox.cpp#L445) | ERROR | - | | ODB | 0531 | [3dblox.cpp:578](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/3dblox/3dblox.cpp#L578) | ERROR | - | | ODB | 0532 | [3dblox.cpp:585](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/3dblox/3dblox.cpp#L585) | ERROR | - | | ODB | 0533 | [dbChipPath.cpp:149](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbChipPath.cpp#L149) | ERROR | - | | ODB | 0534 | [dbChipBump.cpp:168](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbChipBump.cpp#L168) | ERROR | - | | ODB | 0535 | [bmapParser.cpp:25](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/3dblox/bmapParser.cpp#L25) | ERROR | - | | ODB | 0536 | [bmapParser.cpp:67](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/3dblox/bmapParser.cpp#L67) | ERROR | - | | ODB | 0537 | [bmapParser.cpp:87](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/3dblox/bmapParser.cpp#L87) | ERROR | - | | ODB | 0538 | [3dblox.cpp:895](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/3dblox/3dblox.cpp#L895) | ERROR | - | | ODB | 0539 | [3dblox.cpp:913](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/3dblox/3dblox.cpp#L913) | ERROR | - | | ODB | 0540 | [baseWriter.cpp:66](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/3dblox/baseWriter.cpp#L66) | ERROR | - | | ODB | 0541 | [dbvWriter.cpp:218](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/3dblox/dbvWriter.cpp#L218) | INFO | - | | ODB | 0542 | [3dblox.cpp:940](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/3dblox/3dblox.cpp#L940) | ERROR | - | | ODB | 0543 | [3dblox.cpp:926](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/3dblox/3dblox.cpp#L926) | ERROR | - | | ODB | 0544 | [3dblox.cpp:933](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/3dblox/3dblox.cpp#L933) | ERROR | - | | ODB | 0545 | [3dblox.cpp:639](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/3dblox/3dblox.cpp#L639) | WARN | - | | ODB | 0546 | [dbInst.cpp:1526](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbInst.cpp#L1526) | ERROR | - | | ODB | 0555 | [3dblox.cpp:111](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/3dblox/3dblox.cpp#L111) | WARN | - | | ODB | 0562 | [bmapWriter.cpp:59](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/3dblox/bmapWriter.cpp#L59) | ERROR | - | | ODB | 0563 | [verilogWriter.cpp:29](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/3dblox/verilogWriter.cpp#L29) | ERROR | - | | ODB | 1000 | [odb.tcl:75](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L75) | WARN | - | | ODB | 1001 | [odb.tcl:146](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L146) | WARN | - | | ODB | 1002 | [odb.tcl:149](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L149) | WARN | - | | ODB | 1003 | [odb.tcl:207](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L207) | WARN | - | | ODB | 1004 | [odb.tcl:163](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L163) | ERROR | - | | ODB | 1005 | [odb.tcl:170](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L170) | ERROR | - | | ODB | 1006 | [odb.tcl:175](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L175) | ERROR | - | | ODB | 1007 | [odb.tcl:182](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L182) | ERROR | - | | ODB | 1008 | [odb.tcl:190](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L190) | ERROR | - | | ODB | 1009 | [odb.tcl:95](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L95) | WARN | - | | ODB | 1010 | [odb.tcl:885](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L885) | ERROR | - | | ODB | 1011 | [odb.tcl:896](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L896) | ERROR | - | | ODB | 1012 | [odb.tcl:911](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L911) | ERROR | - | | ODB | 1013 | [odb.tcl:927](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L927) | ERROR | - | | ODB | 1014 | [odb.tcl:939](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L939) | ERROR | - | | ODB | 1015 | [odb.tcl:955](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L955) | ERROR | - | | ODB | 1016 | [odb.tcl:921](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L921) | WARN | - | | ODB | 1017 | [odb.tcl:990](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L990) | ERROR | - | | ODB | 1018 | [odb.tcl:994](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L994) | ERROR | - | | ODB | 1019 | [odb.tcl:999](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L999) | ERROR | - | | ODB | 1020 | [odb.tcl:1010](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L1010) | ERROR | - | | ODB | 1021 | [odb.tcl:1024](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L1024) | ERROR | - | | ODB | 1022 | [odb.tcl:1032](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/swig/tcl/odb.tcl#L1032) | ERROR | - | | ODB | 1100 | [dbAccessPoint.cpp:294](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbAccessPoint.cpp#L294) | ERROR | - | | ODB | 1101 | [dbAccessPoint.cpp:314](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbAccessPoint.cpp#L314) | ERROR | - | | ODB | 1102 | [dbWireCodec.cpp:612](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbWireCodec.cpp#L612) | ERROR | - | | ODB | 1103 | [dbWireCodec.cpp:636](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbWireCodec.cpp#L636) | ERROR | - | | ODB | 1104 | [dbITerm.cpp:569](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbITerm.cpp#L569) | ERROR | - | | ODB | 1105 | [dbITerm.cpp:580](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbITerm.cpp#L580) | ERROR | - | | ODB | 1106 | [dbBTerm.cpp:494](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbBTerm.cpp#L494) | ERROR | - | | ODB | 1107 | [dbJournal.cpp:464](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbJournal.cpp#L464) | CRITICAL | - | | ODB | 1108 | [dbJournal.cpp:674](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbJournal.cpp#L674) | CRITICAL | - | | ODB | 1109 | [dbJournal.cpp:841](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbJournal.cpp#L841) | CRITICAL | - | | ODB | 1110 | [dbJournal.cpp:764](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbJournal.cpp#L764) | CRITICAL | - | | ODB | 1111 | [dbObstruction.cpp:388](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbObstruction.cpp#L388) | ERROR | - | | ODB | 1112 | [dbBlockage.cpp:233](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbBlockage.cpp#L233) | ERROR | - | | ODB | 1113 | [dbWireCodec.cpp:81](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbWireCodec.cpp#L81) | ERROR | - | | ODB | 1114 | [dbWire.cpp:768](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbWire.cpp#L768) | ERROR | - | | ODB | 1116 | [dbWireGraph.cpp:390](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbWireGraph.cpp#L390) | ERROR | - | | ODB | 1117 | [dbWireGraph.cpp:378](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbWireGraph.cpp#L378) | ERROR | - | | ODB | 1118 | [dbTechLayer.cpp:1226](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbTechLayer.cpp#L1226) | WARN | - | | ODB | 1200 | [dbInsertBuffer.cpp:1414](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbInsertBuffer.cpp#L1414) | ERROR | - | | ODB | 1201 | [dbInsertBuffer.cpp:1390](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbInsertBuffer.cpp#L1390) | WARN | - | | ODB | 1202 | [dbInsertBuffer.cpp:1347](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbInsertBuffer.cpp#L1347) | WARN | - | | ODB | 1203 | [dbInsertBuffer.cpp:502](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbInsertBuffer.cpp#L502) | ERROR | - | | ODB | 1204 | [dbInsertBuffer.cpp:1398](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbInsertBuffer.cpp#L1398) | ERROR | - | | ODB | 1205 | [dbInsertBuffer.cpp:181](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbInsertBuffer.cpp#L181) | ERROR | - | | ODB | 1206 | [dbInsertBuffer.cpp:914](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbInsertBuffer.cpp#L914) | ERROR | - | | ODB | 1207 | [dbInsertBuffer.cpp:263](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbInsertBuffer.cpp#L263) | WARN | - | | ODB | 1208 | [dbInsertBuffer.cpp:272](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbInsertBuffer.cpp#L272) | WARN | - | | ODB | 1209 | [dbInsertBuffer.cpp:282](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbInsertBuffer.cpp#L282) | WARN | - | | ODB | 1210 | [dbInsertBuffer.cpp:1318](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbInsertBuffer.cpp#L1318) | ERROR | - | | ODB | 1211 | [dbInsertBuffer.cpp:1375](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbInsertBuffer.cpp#L1375) | WARN | - | | ODB | 1212 | [dbInsertBuffer.cpp:540](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbInsertBuffer.cpp#L540) | ERROR | - | | ODB | 1213 | [dbInsertBuffer.cpp:1867](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbInsertBuffer.cpp#L1867) | ERROR | - | | ODB | 1214 | [dbInsertBuffer.cpp:1872](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbInsertBuffer.cpp#L1872) | ERROR | - | | ODB | 1215 | [dbInsertBuffer.cpp:1882](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbInsertBuffer.cpp#L1882) | ERROR | - | | ODB | 1216 | [dbInsertBuffer.cpp:1888](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbInsertBuffer.cpp#L1888) | ERROR | - | | ODB | 1217 | [dbInsertBuffer.cpp:246](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbInsertBuffer.cpp#L246) | ERROR | - | | ODB | 1218 | [dbInsertBuffer.cpp:1234](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/db/dbInsertBuffer.cpp#L1234) | ERROR | - | | ODB | 2000 | [lefin.cpp:1273](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/odb/src/lefin/lefin.cpp#L1273) | WARN | - | | ORD | 0001 | [OpenRoad.tcl:13](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.tcl#L13) | ERROR | - | | ORD | 0002 | [OpenRoad.tcl:16](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.tcl#L16) | ERROR | - | | ORD | 0003 | [OpenRoad.tcl:54](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.tcl#L54) | ERROR | - | | ORD | 0004 | [OpenRoad.tcl:57](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.tcl#L57) | ERROR | - | | ORD | 0005 | [OpenRoad.tcl:66](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.tcl#L66) | ERROR | - | | ORD | 0006 | [OpenRoad.tcl:112](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.tcl#L112) | ERROR | - | | ORD | 0007 | [OpenRoad.tcl:251](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.tcl#L251) | ERROR | - | | ORD | 0008 | [OpenRoad.tcl:255](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.tcl#L255) | ERROR | - | | ORD | 0009 | [SpefWriter.cc:195](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/SpefWriter.cc#L195) | ERROR | - | | ORD | 0010 | [SpefWriter.cc:145](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/SpefWriter.cc#L145) | ERROR | - | | ORD | 0011 | [OpenRoad.cc:636](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.cc#L636) | WARN | - | | ORD | 0012 | [OpenRoad.cc:568](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.cc#L568) | WARN | - | | ORD | 0013 | [OpenRoad.tcl:526](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.tcl#L526) | ERROR | - | | ORD | 0014 | [Metrics.tcl:31](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/Metrics.tcl#L31) | ERROR | - | | ORD | 0015 | [OpenRoad.i:457](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.i#L457) | ERROR | - | | ORD | 0016 | [OpenRoad.tcl:77](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.tcl#L77) | ERROR | - | | ORD | 0017 | [Metrics.tcl:47](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/Metrics.tcl#L47) | ERROR | - | | ORD | 0018 | [Metrics.tcl:63](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/Metrics.tcl#L63) | ERROR | - | | ORD | 0019 | [Metrics.tcl:15](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/Metrics.tcl#L15) | ERROR | - | | ORD | 0020 | [SpefWriter.cc:162](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/SpefWriter.cc#L162) | ERROR | - | | ORD | 0021 | [OpenRoad.tcl:83](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.tcl#L83) | ERROR | - | | ORD | 0030 | [OpenRoad.cc:682](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.cc#L682) | INFO | - | | ORD | 0031 | [OpenRoad.cc:668](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.cc#L668) | WARN | - | | ORD | 0032 | [OpenRoad.cc:702](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.cc#L702) | WARN | - | | ORD | 0033 | [OpenRoad.tcl:71](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.tcl#L71) | WARN | - | | ORD | 0034 | [OpenRoad.cc:467](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.cc#L467) | INFO | - | | ORD | 0036 | [Design.cc:52](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/Design.cc#L52) | ERROR | - | | ORD | 0037 | [Design.cc:115](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/Design.cc#L115) | ERROR | - | | ORD | 0038 | [Main.cc:316](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/Main.cc#L316) | WARN | - | | ORD | 0039 | [Main.cc:320](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/Main.cc#L320) | WARN | - | | ORD | 0041 | [OpenRoad.tcl:369](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.tcl#L369) | ERROR | - | | ORD | 0042 | [OpenRoad.tcl:374](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.tcl#L374) | ERROR | - | | ORD | 0043 | [OpenRoad.tcl:382](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.tcl#L382) | ERROR | - | | ORD | 0044 | [OpenRoad.tcl:389](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.tcl#L389) | WARN | - | | ORD | 0045 | [OpenRoad.tcl:412](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.tcl#L412) | ERROR | - | | ORD | 0046 | [OpenRoad.tcl:404](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.tcl#L404) | WARN | - | | ORD | 0047 | [OpenRoad.cc:584](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.cc#L584) | ERROR | - | | ORD | 0048 | [OpenRoad.cc:367](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.cc#L367) | INFO | - | | ORD | 0049 | [OpenRoad.i:510](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.i#L510) | ERROR | - | | ORD | 0050 | [OpenRoad.i:521](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.i#L521) | ERROR | - | | ORD | 0051 | [OpenRoad.cc:354](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.cc#L354) | ERROR | - | | ORD | 0052 | [OpenRoad.tcl:63](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.tcl#L63) | ERROR | - | | ORD | 0053 | [OpenRoad.cc:447](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.cc#L447) | ERROR | - | | ORD | 0054 | [OpenRoad.cc:564](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.cc#L564) | ERROR | - | | ORD | 0055 | [OpenRoad.tcl:427](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.tcl#L427) | ERROR | - | | ORD | 0056 | [OpenRoad.tcl:444](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.tcl#L444) | ERROR | - | | ORD | 0057 | [OpenRoad.tcl:451](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.tcl#L451) | ERROR | - | | ORD | 0059 | [OpenRoad.tcl:470](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.tcl#L470) | ERROR | - | | ORD | 0060 | [OpenRoad.tcl:473](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.tcl#L473) | ERROR | - | | ORD | 0061 | [OpenRoad.tcl:476](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.tcl#L476) | ERROR | - | | ORD | 0062 | [OpenRoad.tcl:461](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.tcl#L461) | ERROR | - | | ORD | 0063 | [OpenRoad.tcl:464](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.tcl#L464) | ERROR | - | | ORD | 0065 | [OpenRoad.tcl:509](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.tcl#L509) | ERROR | - | | ORD | 0066 | [OpenRoad.tcl:484](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.tcl#L484) | ERROR | - | | ORD | 0067 | [OpenRoad.tcl:487](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.tcl#L487) | ERROR | - | | ORD | 0068 | [OpenRoad.tcl:481](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.tcl#L481) | ERROR | - | | ORD | 0069 | [dbEditHierarchy.cc:164](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbEditHierarchy.cc#L164) | ERROR | - | | ORD | 0070 | [OpenRoad.tcl:177](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.tcl#L177) | ERROR | - | | ORD | 0071 | [OpenRoad.tcl:180](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.tcl#L180) | ERROR | - | | ORD | 0072 | [OpenRoad.tcl:208](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.tcl#L208) | ERROR | - | | ORD | 0073 | [OpenRoad.tcl:211](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.tcl#L211) | ERROR | - | | ORD | 0074 | [OpenRoad.tcl:223](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.tcl#L223) | ERROR | - | | ORD | 0075 | [OpenRoad.tcl:226](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.tcl#L226) | ERROR | - | | ORD | 0076 | [OpenRoad.cc:537](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.cc#L537) | ERROR | - | | ORD | 0101 | [Design.cc:65](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/Design.cc#L65) | ERROR | - | | ORD | 0102 | [Design.cc:71](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/Design.cc#L71) | ERROR | - | | ORD | 0104 | [Timing.cc:132](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/Timing.cc#L132) | ERROR | - | | ORD | 0560 | [OpenRoad.tcl:583](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.tcl#L583) | ERROR | - | | ORD | 1009 | [OpenRoad.tcl:273](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.tcl#L273) | ERROR | - | | ORD | 1010 | [OpenRoad.tcl:276](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.tcl#L276) | ERROR | - | | ORD | 1011 | [OpenRoad.tcl:282](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.tcl#L282) | ERROR | - | | ORD | 1012 | [OpenRoad.tcl:288](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.tcl#L288) | ERROR | - | | ORD | 1013 | [OpenRoad.tcl:160](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.tcl#L160) | ERROR | - | | ORD | 1050 | [OpenRoad.tcl:143](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/OpenRoad.tcl#L143) | ERROR | - | | ORD | 2000 | [dbNetwork.cc:4952](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L4952) | ERROR | - | | ORD | 2001 | [dbNetwork.cc:2236](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L2236) | WARN | - | | ORD | 2002 | [dbNetwork.cc:2428](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L2428) | WARN | - | | ORD | 2003 | [dbNetwork.cc:2876](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L2876) | CRITICAL | - | | ORD | 2004 | [dbNetwork.cc:2957](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L2957) | CRITICAL | - | | ORD | 2005 | [dbNetwork.cc:2962](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L2962) | CRITICAL | - | | ORD | 2006 | [dbNetwork.cc:5030](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L5030) | WARN | - | | ORD | 2007 | [dbNetwork.cc:3311](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L3311) | CRITICAL | - | | ORD | 2008 | [dbNetwork.cc:3452](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L3452) | CRITICAL | - | | ORD | 2009 | [dbNetwork.cc:4963](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L4963) | WARN | - | | ORD | 2010 | [dbReadVerilog.tcl:24](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbReadVerilog.tcl#L24) | ERROR | - | | ORD | 2011 | [dbReadVerilog.cc:1029](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbReadVerilog.cc#L1029) | WARN | - | | ORD | 2012 | [dbReadVerilog.cc:1035](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbReadVerilog.cc#L1035) | WARN | - | | ORD | 2013 | [dbReadVerilog.cc:554](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbReadVerilog.cc#L554) | ERROR | - | | ORD | 2014 | [dbNetwork.cc:162](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L162) | ERROR | - | | ORD | 2015 | [dbReadVerilog.cc:586](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbReadVerilog.cc#L586) | ERROR | - | | ORD | 2016 | [dbNetwork.cc:2998](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L2998) | ERROR | - | | ORD | 2017 | [dbNetwork.cc:228](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L228) | ERROR | - | | ORD | 2018 | [dbNetwork.cc:3138](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L3138) | ERROR | - | | ORD | 2019 | [dbNetwork.cc:196](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L196) | ERROR | - | | ORD | 2020 | [dbNetwork.cc:848](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L848) | ERROR | - | | ORD | 2021 | [dbNetwork.cc:3582](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L3582) | ERROR | - | | ORD | 2022 | [dbNetwork.cc:3602](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L3602) | ERROR | - | | ORD | 2023 | [dbReadVerilog.cc:415](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbReadVerilog.cc#L415) | ERROR | - | | ORD | 2024 | [dbNetwork.cc:2650](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L2650) | ERROR | - | | ORD | 2025 | [dbNetwork.cc:2569](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L2569) | ERROR | - | | ORD | 2026 | [dbNetwork.cc:2580](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L2580) | ERROR | - | | ORD | 2027 | [dbNetwork.cc:2593](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L2593) | ERROR | - | | ORD | 2028 | [dbNetwork.cc:2607](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L2607) | ERROR | - | | ORD | 2029 | [dbNetwork.cc:2090](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L2090) | ERROR | - | | ORD | 2030 | [dbNetwork.cc:4245](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L4245) | ERROR | - | | ORD | 2031 | [dbNetwork.cc:4230](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L4230) | WARN | - | | ORD | 2032 | [dbNetwork.cc:4006](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L4006) | ERROR | - | | ORD | 2033 | [dbNetwork.cc:3187](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L3187) | ERROR | - | | ORD | 2034 | [dbNetwork.cc:3039](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L3039) | ERROR | - | | ORD | 2035 | [dbNetwork.cc:3279](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L3279) | ERROR | - | | ORD | 2036 | [dbNetwork.cc:4495](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L4495) | ERROR | - | | ORD | 2037 | [dbNetwork.cc:4518](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L4518) | ERROR | - | | ORD | 2038 | [dbNetwork.cc:4535](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L4535) | WARN | - | | ORD | 2040 | [dbNetwork.cc:4679](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L4679) | ERROR | - | | ORD | 2041 | [dbNetwork.cc:4695](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L4695) | ERROR | - | | ORD | 2042 | [dbNetwork.cc:4603](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L4603) | WARN | - | | ORD | 2043 | [dbNetwork.cc:4666](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L4666) | WARN | - | | ORD | 2044 | [dbNetwork.cc:4805](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L4805) | ERROR | - | | ORD | 2045 | [dbNetwork.cc:4818](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L4818) | ERROR | - | | ORD | 2046 | [dbNetwork.cc:4840](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L4840) | ERROR | - | | ORD | 2047 | [dbNetwork.cc:4938](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L4938) | ERROR | - | | ORD | 2048 | [dbNetwork.cc:4545](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L4545) | ERROR | - | | ORD | 2050 | [dbNetwork.cc:4872](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L4872) | WARN | - | | ORD | 2051 | [dbNetwork.cc:4926](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L4926) | INFO | - | | ORD | 2052 | [dbNetwork.cc:4932](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L4932) | INFO | - | | ORD | 2053 | [dbNetwork.cc:4616](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L4616) | WARN | - | | ORD | 2054 | [dbNetwork.cc:4625](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L4625) | WARN | - | | ORD | 2055 | [dbNetwork.cc:4878](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L4878) | WARN | - | | ORD | 2056 | [dbNetwork.cc:2388](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbNetwork.cc#L2388) | WARN | - | | PAD | 0001 | [PadPlacer.cpp:289](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/PadPlacer.cpp#L289) | ERROR | - | | PAD | 0002 | [ICeWall.cpp:1260](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/ICeWall.cpp#L1260) | ERROR | - | | PAD | 0003 | [RDLRouter.cpp:152](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/RDLRouter.cpp#L152) | WARN | - | | PAD | 0004 | [RDLRouter.cpp:166](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/RDLRouter.cpp#L166) | WARN | - | | PAD | 0005 | [RDLRouter.cpp:388](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/RDLRouter.cpp#L388) | INFO | - | | PAD | 0006 | [RDLRouter.cpp:287](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/RDLRouter.cpp#L287) | WARN | - | | PAD | 0007 | [RDLRouter.cpp:692](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/RDLRouter.cpp#L692) | ERROR | - | | PAD | 0008 | [pad.tcl:360](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/pad.tcl#L360) | ERROR | - | | PAD | 0009 | [ICeWall.cpp:706](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/ICeWall.cpp#L706) | WARN | - | | PAD | 0010 | [RDLRouter.cpp:2160](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/RDLRouter.cpp#L2160) | WARN | - | | PAD | 0011 | [ICeWall.cpp:59](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/ICeWall.cpp#L59) | ERROR | - | | PAD | 0012 | [ICeWall.cpp:73](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/ICeWall.cpp#L73) | ERROR | - | | PAD | 0013 | [ICeWall.cpp:511](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/ICeWall.cpp#L511) | ERROR | - | | PAD | 0014 | [ICeWall.cpp:304](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/ICeWall.cpp#L304) | ERROR | - | | PAD | 0015 | [ICeWall.cpp:307](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/ICeWall.cpp#L307) | ERROR | - | | PAD | 0016 | [ICeWall.cpp:310](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/ICeWall.cpp#L310) | ERROR | - | | PAD | 0017 | [pad.tcl:35](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/pad.tcl#L35) | ERROR | - | | PAD | 0018 | [ICeWall.cpp:566](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/ICeWall.cpp#L566) | ERROR | - | | PAD | 0019 | [ICeWall.cpp:582](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/ICeWall.cpp#L582) | ERROR | - | | PAD | 0020 | [ICeWall.cpp:795](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/ICeWall.cpp#L795) | ERROR | - | | PAD | 0021 | [ICeWall.cpp:973](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/ICeWall.cpp#L973) | ERROR | - | | PAD | 0022 | [ICeWall.cpp:1451](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/ICeWall.cpp#L1451) | ERROR | - | | PAD | 0023 | [ICeWall.cpp:56](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/ICeWall.cpp#L56) | ERROR | - | | PAD | 0024 | [ICeWall.cpp:179](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/ICeWall.cpp#L179) | ERROR | - | | PAD | 0025 | [ICeWall.cpp:184](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/ICeWall.cpp#L184) | ERROR | - | | PAD | 0026 | [ICeWall.cpp:878](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/ICeWall.cpp#L878) | ERROR | - | | PAD | 0027 | [ICeWall.cpp:998](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/ICeWall.cpp#L998) | ERROR | - | | PAD | 0028 | [ICeWall.cpp:505](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/ICeWall.cpp#L505) | ERROR | - | | PAD | 0029 | [ICeWall.cpp:781](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/ICeWall.cpp#L781) | ERROR | - | | PAD | 0030 | [ICeWall.cpp:953](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/ICeWall.cpp#L953) | ERROR | - | | PAD | 0031 | [ICeWall.cpp:1034](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/ICeWall.cpp#L1034) | WARN | - | | PAD | 0032 | [ICeWall.cpp:1028](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/ICeWall.cpp#L1028) | ERROR | - | | PAD | 0033 | [ICeWall.cpp:142](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/ICeWall.cpp#L142) | WARN | - | | PAD | 0034 | [ICeWall.cpp:149](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/ICeWall.cpp#L149) | ERROR | - | | PAD | 0035 | [ICeWall.cpp:203](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/ICeWall.cpp#L203) | ERROR | - | | PAD | 0036 | [ICeWall.cpp:209](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/ICeWall.cpp#L209) | ERROR | - | | PAD | 0037 | [RDLRouter.cpp:567](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/RDLRouter.cpp#L567) | INFO | - | | PAD | 0038 | [pad.tcl:41](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/pad.tcl#L41) | ERROR | - | | PAD | 0039 | [pad.tcl:246](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/pad.tcl#L246) | ERROR | - | | PAD | 0040 | [ICeWall.cpp:667](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/ICeWall.cpp#L667) | ERROR | - | | PAD | 0041 | [ICeWall.cpp:749](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/ICeWall.cpp#L749) | INFO | - | | PAD | 0042 | [pad.tcl:423](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/pad.tcl#L423) | ERROR | - | | PAD | 0043 | [RDLRouter.cpp:342](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/RDLRouter.cpp#L342) | ERROR | - | | PAD | 0045 | [ICeWall.cpp:534](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/ICeWall.cpp#L534) | WARN | - | | PAD | 0046 | [ICeWall.cpp:541](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/ICeWall.cpp#L541) | WARN | - | | PAD | 0100 | [pad.tcl:490](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/pad.tcl#L490) | ERROR | - | | PAD | 0101 | [pad.tcl:498](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/pad.tcl#L498) | ERROR | - | | PAD | 0102 | [pad.tcl:506](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/pad.tcl#L506) | ERROR | - | | PAD | 0103 | [pad.tcl:514](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/pad.tcl#L514) | ERROR | - | | PAD | 0104 | [pad.tcl:522](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/pad.tcl#L522) | ERROR | - | | PAD | 0105 | [pad.tcl:429](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/pad.tcl#L429) | ERROR | - | | PAD | 0106 | [pad.i:166](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/pad.i#L166) | ERROR | - | | PAD | 0107 | [pad.tcl:435](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/pad.tcl#L435) | ERROR | - | | PAD | 0108 | [pad.tcl:442](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/pad.tcl#L442) | ERROR | - | | PAD | 0109 | [pad.tcl:530](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/pad.tcl#L530) | ERROR | - | | PAD | 0110 | [pad.tcl:535](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/pad.tcl#L535) | ERROR | - | | PAD | 0111 | [pad.tcl:540](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/pad.tcl#L540) | ERROR | - | | PAD | 0112 | [pad.tcl:142](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/pad.tcl#L142) | WARN | - | | PAD | 0113 | [pad.tcl:98](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/pad.tcl#L98) | ERROR | - | | PAD | 0114 | [pad.tcl:104](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/pad.tcl#L104) | ERROR | - | | PAD | 0115 | [ICeWall.cpp:1138](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/ICeWall.cpp#L1138) | ERROR | - | | PAD | 0116 | [ICeWall.cpp:160](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/ICeWall.cpp#L160) | INFO | - | | PAD | 0117 | [pad.tcl:325](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/pad.tcl#L325) | ERROR | - | | PAD | 0118 | [ICeWall.cpp:573](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/ICeWall.cpp#L573) | ERROR | - | | PAD | 0119 | [PadPlacer.cpp:231](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/PadPlacer.cpp#L231) | ERROR | - | | PAD | 0120 | [ICeWall.cpp:1148](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pad/src/ICeWall.cpp#L1148) | ERROR | - | | PAR | 0001 | [PartitionMgr.cpp:788](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/par/src/PartitionMgr.cpp#L788) | INFO | - | | PAR | 0002 | [TritonPart.cpp:241](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/par/src/TritonPart.cpp#L241) | INFO | - | | PAR | 0003 | [TritonPart.cpp:282](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/par/src/TritonPart.cpp#L282) | WARN | - | | PAR | 0004 | [TritonPart.cpp:330](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/par/src/TritonPart.cpp#L330) | INFO | - | | PAR | 0005 | [TritonPart.cpp:399](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/par/src/TritonPart.cpp#L399) | INFO | - | | PAR | 0006 | [TritonPart.cpp:455](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/par/src/TritonPart.cpp#L455) | INFO | - | | PAR | 0007 | [TritonPart.cpp:488](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/par/src/TritonPart.cpp#L488) | INFO | - | | PAR | 0008 | [TritonPart.cpp:528](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/par/src/TritonPart.cpp#L528) | ERROR | - | | PAR | 0009 | [TritonPart.cpp:539](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/par/src/TritonPart.cpp#L539) | WARN | - | | PAR | 0010 | [TritonPart.cpp:698](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/par/src/TritonPart.cpp#L698) | INFO | - | | PAR | 0011 | [TritonPart.cpp:775](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/par/src/TritonPart.cpp#L775) | INFO | - | | PAR | 0012 | [TritonPart.cpp:891](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/par/src/TritonPart.cpp#L891) | INFO | - | | PAR | 0013 | [TritonPart.cpp:897](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/par/src/TritonPart.cpp#L897) | INFO | - | | PAR | 0015 | [PartitionMgr.cpp:797](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/par/src/PartitionMgr.cpp#L797) | WARN | - | | PAR | 0017 | [TritonPart.cpp:1223](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/par/src/TritonPart.cpp#L1223) | INFO | - | | PAR | 0018 | [TritonPart.cpp:1536](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/par/src/TritonPart.cpp#L1536) | INFO | - | | PAR | 0019 | [TritonPart.cpp:1747](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/par/src/TritonPart.cpp#L1747) | WARN | - | | PAR | 0021 | [TritonPart.cpp:1360](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/par/src/TritonPart.cpp#L1360) | WARN | - | | PAR | 0022 | [TritonPart.cpp:1387](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/par/src/TritonPart.cpp#L1387) | WARN | - | | PAR | 0023 | [TritonPart.cpp:1414](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/par/src/TritonPart.cpp#L1414) | WARN | - | | PAR | 0024 | [TritonPart.cpp:1553](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/par/src/TritonPart.cpp#L1553) | WARN | - | | PAR | 0025 | [PartitionMgr.cpp:878](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/par/src/PartitionMgr.cpp#L878) | ERROR | - | | PAR | 0026 | [PartitionMgr.cpp:887](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/par/src/PartitionMgr.cpp#L887) | ERROR | - | | PAR | 0027 | [PartitionMgr.cpp:911](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/par/src/PartitionMgr.cpp#L911) | ERROR | - | | PAR | 0028 | [PartitionMgr.cpp:922](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/par/src/PartitionMgr.cpp#L922) | ERROR | - | | PAR | 0029 | [TritonPart.cpp:906](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/par/src/TritonPart.cpp#L906) | ERROR | - | | PAR | 0030 | [TritonPart.cpp:1004](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/par/src/TritonPart.cpp#L1004) | ERROR | - | | PAR | 0031 | [TritonPart.cpp:1085](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/par/src/TritonPart.cpp#L1085) | ERROR | - | | PAR | 0032 | [TritonPart.cpp:1103](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/par/src/TritonPart.cpp#L1103) | ERROR | - | | PAR | 0033 | [TritonPart.cpp:1124](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/par/src/TritonPart.cpp#L1124) | ERROR | - | | PAR | 0034 | [TritonPart.cpp:1147](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/par/src/TritonPart.cpp#L1147) | ERROR | - | | PAR | 0035 | [TritonPart.cpp:1510](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/par/src/TritonPart.cpp#L1510) | ERROR | - | | PAR | 0036 | [PartitionMgr.cpp:901](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/par/src/PartitionMgr.cpp#L901) | ERROR | - | | PAR | 0037 | [TritonPart.cpp:1505](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/par/src/TritonPart.cpp#L1505) | INFO | - | | PAR | 0051 | [partitionmgr.tcl:999](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/par/src/partitionmgr.tcl#L999) | ERROR | - | | PAR | 0053 | [ArtNetSpec.cpp:82](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/par/src/ArtNetSpec.cpp#L82) | ERROR | - | | PAR | 0054 | [ArtNetSpec.cpp:745](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/par/src/ArtNetSpec.cpp#L745) | ERROR | - | | PAR | 0055 | [ArtNetSpec.cpp:85](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/par/src/ArtNetSpec.cpp#L85) | ERROR | - | | PAR | 0056 | [ArtNetSpec.cpp:158](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/par/src/ArtNetSpec.cpp#L158) | ERROR | - | | PAR | 0103 | [partitionmgr.tcl:490](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/par/src/partitionmgr.tcl#L490) | ERROR | - | | PAR | 0104 | [partitionmgr.tcl:811](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/par/src/partitionmgr.tcl#L811) | ERROR | - | | PAR | 0142 | [Evaluator.cpp:266](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/par/src/Evaluator.cpp#L266) | WARN | - | | PAR | 0924 | [partitionmgr.tcl:82](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/par/src/partitionmgr.tcl#L82) | ERROR | - | | PAR | 0925 | [partitionmgr.tcl:318](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/par/src/partitionmgr.tcl#L318) | ERROR | - | | PAR | 0926 | [partitionmgr.tcl:322](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/par/src/partitionmgr.tcl#L322) | ERROR | - | | PDN | 0001 | [grid.cpp:120](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/grid.cpp#L120) | INFO | - | | PDN | 0002 | [pdn.tcl:22](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L22) | ERROR | - | | PDN | 0003 | [connect.cpp:35](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/connect.cpp#L35) | ERROR | - | | PDN | 0004 | [connect.cpp:42](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/connect.cpp#L42) | ERROR | - | | PDN | 0005 | [connect.cpp:46](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/connect.cpp#L46) | ERROR | - | | PDN | 0006 | [grid.cpp:1784](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/grid.cpp#L1784) | ERROR | - | | PDN | 0007 | [grid.cpp:1802](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/grid.cpp#L1802) | WARN | - | | PDN | 0100 | [domain.cpp:238](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/domain.cpp#L238) | ERROR | - | | PDN | 0101 | [domain.cpp:260](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/domain.cpp#L260) | INFO | - | | PDN | 0102 | [domain.cpp:269](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/domain.cpp#L269) | INFO | - | | PDN | 0103 | [domain.cpp:62](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/domain.cpp#L62) | ERROR | - | | PDN | 0104 | [domain.cpp:65](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/domain.cpp#L65) | ERROR | - | | PDN | 0105 | [rings.cpp:135](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/rings.cpp#L135) | WARN | - | | PDN | 0106 | [grid_component.cpp:392](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/grid_component.cpp#L392) | ERROR | - | | PDN | 0107 | [grid_component.cpp:404](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/grid_component.cpp#L404) | ERROR | - | | PDN | 0108 | [grid_component.cpp:487](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/grid_component.cpp#L487) | ERROR | - | | PDN | 0109 | [straps.cpp:567](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/straps.cpp#L567) | ERROR | - | | PDN | 0110 | [via.cpp:1140](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/via.cpp#L1140) | WARN | - | | PDN | 0111 | [grid.cpp:718](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/grid.cpp#L718) | ERROR | - | | PDN | 0112 | [grid.cpp:786](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/grid.cpp#L786) | ERROR | - | | PDN | 0113 | [grid.cpp:792](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/grid.cpp#L792) | ERROR | - | | PDN | 0114 | [grid_component.cpp:452](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/grid_component.cpp#L452) | ERROR | - | | PDN | 0115 | [sroute.cpp:78](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/sroute.cpp#L78) | ERROR | - | | PDN | 0116 | [sroute.cpp:134](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/sroute.cpp#L134) | ERROR | - | | PDN | 0117 | [grid_component.cpp:466](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/grid_component.cpp#L466) | ERROR | - | | PDN | 0118 | [grid_component.cpp:500](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/grid_component.cpp#L500) | ERROR | - | | PDN | 0175 | [straps.cpp:99](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/straps.cpp#L99) | ERROR | - | | PDN | 0178 | [straps.cpp:2478](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/straps.cpp#L2478) | WARN | - | | PDN | 0179 | [straps.cpp:2496](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/straps.cpp#L2496) | ERROR | - | | PDN | 0181 | [domain.cpp:245](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/domain.cpp#L245) | ERROR | - | | PDN | 0182 | [PdnGen.cc:537](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/PdnGen.cc#L537) | WARN | - | | PDN | 0183 | [PdnGen.cc:329](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/PdnGen.cc#L329) | WARN | - | | PDN | 0184 | [PdnGen.cc:357](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/PdnGen.cc#L357) | ERROR | - | | PDN | 0185 | [straps.cpp:129](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/straps.cpp#L129) | ERROR | - | | PDN | 0186 | [grid.cpp:102](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/grid.cpp#L102) | ERROR | - | | PDN | 0187 | [straps.cpp:68](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/straps.cpp#L68) | ERROR | - | | PDN | 0188 | [grid.cpp:1974](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/grid.cpp#L1974) | ERROR | - | | PDN | 0189 | [PdnGen.cc:968](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/PdnGen.cc#L968) | WARN | - | | PDN | 0190 | [straps.cpp:441](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/straps.cpp#L441) | ERROR | - | | PDN | 0191 | [techlayer.cpp:167](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/techlayer.cpp#L167) | ERROR | - | | PDN | 0192 | [grid.cpp:660](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/grid.cpp#L660) | ERROR | - | | PDN | 0193 | [grid.cpp:668](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/grid.cpp#L668) | ERROR | - | | PDN | 0194 | [grid.cpp:692](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/grid.cpp#L692) | ERROR | - | | PDN | 0195 | [via.cpp:3106](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/via.cpp#L3106) | WARN | - | | PDN | 0196 | [PdnGen.cc:399](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/PdnGen.cc#L399) | ERROR | - | | PDN | 0197 | [power_cells.cpp:135](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/power_cells.cpp#L135) | ERROR | - | | PDN | 0198 | [power_cells.cpp:106](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/power_cells.cpp#L106) | ERROR | - | | PDN | 0199 | [PdnGen.cc:370](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/PdnGen.cc#L370) | ERROR | - | | PDN | 0200 | [shape.cpp:391](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/shape.cpp#L391) | WARN | - | | PDN | 0201 | [PdnGen.cc:472](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/PdnGen.cc#L472) | ERROR | - | | PDN | 0202 | [PdnGen.cc:476](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/PdnGen.cc#L476) | ERROR | - | | PDN | 0203 | [PdnGen.cc:1038](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/PdnGen.cc#L1038) | ERROR | - | | PDN | 0204 | [PdnGen.cc:1047](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/PdnGen.cc#L1047) | ERROR | - | | PDN | 0205 | [PdnGen.cc:1078](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/PdnGen.cc#L1078) | ERROR | - | | PDN | 0206 | [PdnGen.cc:1085](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/PdnGen.cc#L1085) | ERROR | - | | PDN | 0207 | [PdnGen.cc:1092](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/PdnGen.cc#L1092) | ERROR | - | | PDN | 0208 | [PdnGen.cc:1099](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/PdnGen.cc#L1099) | ERROR | - | | PDN | 0209 | [PdnGen.cc:1113](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/PdnGen.cc#L1113) | WARN | - | | PDN | 0210 | [PdnGen.cc:336](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/PdnGen.cc#L336) | ERROR | - | | PDN | 0211 | [pdn.tcl:365](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L365) | WARN | - | | PDN | 0212 | [pdn.tcl:141](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L141) | ERROR | - | | PDN | 0213 | [PdnGen.cc:839](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/PdnGen.cc#L839) | WARN | - | | PDN | 0214 | [shape.cpp:438](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/shape.cpp#L438) | ERROR | - | | PDN | 0215 | [straps.cpp:87](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/straps.cpp#L87) | ERROR | - | | PDN | 0220 | [power_cells.cpp:225](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/power_cells.cpp#L225) | ERROR | - | | PDN | 0221 | [power_cells.cpp:280](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/power_cells.cpp#L280) | ERROR | - | | PDN | 0222 | [power_cells.cpp:214](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/power_cells.cpp#L214) | WARN | - | | PDN | 0223 | [power_cells.cpp:309](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/power_cells.cpp#L309) | WARN | - | | PDN | 0224 | [grid_component.cpp:526](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/grid_component.cpp#L526) | ERROR | - | | PDN | 0225 | [pdn.tcl:334](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L334) | ERROR | - | | PDN | 0226 | [via_repair.cpp:108](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/via_repair.cpp#L108) | WARN | - | | PDN | 0227 | [via.cpp:1059](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/via.cpp#L1059) | WARN | - | | PDN | 0229 | [PdnGen.cc:353](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/PdnGen.cc#L353) | ERROR | - | | PDN | 0230 | [pdn.tcl:474](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L474) | ERROR | - | | PDN | 0231 | [grid.cpp:1702](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/grid.cpp#L1702) | WARN | - | | PDN | 0232 | [PdnGen.cc:147](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/PdnGen.cc#L147) | WARN | - | | PDN | 0233 | [PdnGen.cc:158](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/PdnGen.cc#L158) | ERROR | - | | PDN | 0234 | [PdnGen.cc:983](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/PdnGen.cc#L983) | WARN | - | | PDN | 0235 | [PdnGen.cc:988](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/PdnGen.cc#L988) | ERROR | - | | PDN | 0236 | [PdnGen.cc:1169](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/PdnGen.cc#L1169) | ERROR | - | | PDN | 0237 | [PdnGen.cc:1177](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/PdnGen.cc#L1177) | ERROR | - | | PDN | 0238 | [PdnGen.cc:1108](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/PdnGen.cc#L1108) | ERROR | - | | PDN | 0239 | [rings.cpp:60](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/rings.cpp#L60) | WARN | - | | PDN | 0240 | [power_cells.cpp:329](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/power_cells.cpp#L329) | ERROR | - | | PDN | 0241 | [grid.cpp:1834](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/grid.cpp#L1834) | WARN | - | | PDN | 0351 | [rings.cpp:71](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/rings.cpp#L71) | ERROR | - | | PDN | 1001 | [pdn.tcl:86](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L86) | ERROR | - | | PDN | 1002 | [pdn.tcl:90](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L90) | ERROR | - | | PDN | 1003 | [pdn.tcl:95](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L95) | ERROR | - | | PDN | 1004 | [pdn.tcl:99](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L99) | ERROR | - | | PDN | 1005 | [pdn.tcl:108](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L108) | ERROR | - | | PDN | 1006 | [pdn.tcl:123](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L123) | ERROR | - | | PDN | 1007 | [pdn.tcl:284](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L284) | ERROR | - | | PDN | 1008 | [pdn.tcl:289](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L289) | ERROR | - | | PDN | 1009 | [pdn.tcl:295](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L295) | ERROR | - | | PDN | 1010 | [pdn.tcl:348](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L348) | ERROR | - | | PDN | 1011 | [pdn.tcl:421](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L421) | ERROR | - | | PDN | 1012 | [pdn.tcl:426](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L426) | ERROR | - | | PDN | 1013 | [pdn.tcl:435](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L435) | ERROR | - | | PDN | 1014 | [pdn.tcl:441](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L441) | ERROR | - | | PDN | 1015 | [pdn.tcl:447](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L447) | ERROR | - | | PDN | 1016 | [pdn.tcl:449](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L449) | ERROR | - | | PDN | 1017 | [pdn.tcl:461](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L461) | ERROR | - | | PDN | 1019 | [pdn.tcl:567](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L567) | ERROR | - | | PDN | 1020 | [pdn.tcl:569](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L569) | ERROR | - | | PDN | 1021 | [pdn.tcl:604](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L604) | ERROR | - | | PDN | 1022 | [pdn.tcl:828](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L828) | ERROR | - | | PDN | 1023 | [pdn.tcl:842](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L842) | ERROR | - | | PDN | 1024 | [pdn.tcl:851](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L851) | WARN | - | | PDN | 1025 | [pdn.tcl:873](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L873) | ERROR | - | | PDN | 1026 | [pdn.tcl:982](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L982) | ERROR | - | | PDN | 1027 | [pdn.tcl:998](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L998) | ERROR | - | | PDN | 1028 | [pdn.tcl:1004](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L1004) | ERROR | - | | PDN | 1029 | [pdn.tcl:1013](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L1013) | ERROR | - | | PDN | 1030 | [pdn.tcl:1057](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L1057) | ERROR | - | | PDN | 1031 | [pdn.tcl:1092](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L1092) | WARN | - | | PDN | 1032 | [pdn.tcl:1137](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L1137) | ERROR | - | | PDN | 1033 | [pdn.tcl:1184](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L1184) | ERROR | - | | PDN | 1034 | [pdn.tcl:1197](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L1197) | ERROR | - | | PDN | 1035 | [pdn.tcl:1216](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L1216) | ERROR | - | | PDN | 1036 | [pdn.tcl:1240](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L1240) | ERROR | - | | PDN | 1037 | [pdn.tcl:29](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L29) | ERROR | - | | PDN | 1038 | [pdn.tcl:36](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L36) | ERROR | - | | PDN | 1039 | [pdn.tcl:43](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L43) | ERROR | - | | PDN | 1040 | [pdn.tcl:50](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L50) | ERROR | - | | PDN | 1041 | [pdn.tcl:1098](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L1098) | WARN | - | | PDN | 1042 | [pdn.tcl:149](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L149) | WARN | - | | PDN | 1043 | [pdn.tcl:877](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L877) | ERROR | - | | PDN | 1044 | [pdn.tcl:1016](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L1016) | ERROR | - | | PDN | 1045 | [pdn.tcl:906](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L906) | ERROR | - | | PDN | 1046 | [pdn.tcl:216](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L216) | ERROR | - | | PDN | 1047 | [pdn.tcl:1223](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L1223) | ERROR | - | | PDN | 1048 | [pdn.tcl:902](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L902) | ERROR | - | | PDN | 1049 | [pdn.tcl:910](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L910) | ERROR | - | | PDN | 1183 | [pdn.tcl:212](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L212) | ERROR | - | | PDN | 1184 | [pdn.tcl:221](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L221) | ERROR | - | | PDN | 1186 | [pdn.tcl:232](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L232) | ERROR | - | | PDN | 1187 | [pdn.tcl:238](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L238) | ERROR | - | | PDN | 1188 | [pdn.tcl:244](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L244) | ERROR | - | | PDN | 1190 | [pdn.tcl:798](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L798) | ERROR | - | | PDN | 1191 | [pdn.tcl:788](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L788) | ERROR | - | | PDN | 1192 | [pdn.tcl:791](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L791) | ERROR | - | | PDN | 1193 | [pdn.tcl:674](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L674) | ERROR | - | | PDN | 1194 | [pdn.tcl:680](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L680) | ERROR | - | | PDN | 1195 | [pdn.tcl:677](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L677) | ERROR | - | | PDN | 1196 | [pdn.tcl:683](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L683) | ERROR | - | | PDN | 1197 | [pdn.tcl:695](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/pdn.tcl#L695) | ERROR | - | | PDN | 1200 | [connect.cpp:57](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/pdn/src/connect.cpp#L57) | ERROR | - | | PPL | 0001 | [IOPlacer.cpp:1501](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L1501) | INFO | - | | PPL | 0002 | [IOPlacer.cpp:1506](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L1506) | INFO | - | | PPL | 0003 | [IOPlacer.cpp:1508](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L1508) | INFO | - | | PPL | 0004 | [IOPlacer.cpp:1512](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L1512) | INFO | - | | PPL | 0005 | [IOPlacer.cpp:1518](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L1518) | INFO | - | | PPL | 0006 | [IOPlacer.cpp:1514](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L1514) | INFO | - | | PPL | 0008 | [IOPlacer.cpp:1422](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L1422) | INFO | - | | PPL | 0009 | [IOPlacer.cpp:1425](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L1425) | INFO | - | | PPL | 0011 | [IOPlacer.cpp:1989](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L1989) | ERROR | - | | PPL | 0012 | [IOPlacer.cpp:2566](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L2566) | INFO | - | | PPL | 0013 | [IOPlacer.cpp:1413](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L1413) | ERROR | - | | PPL | 0014 | [IOPlacer.cpp:571](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L571) | ERROR | - | | PPL | 0015 | [IOPlacer.tcl:254](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.tcl#L254) | WARN | - | | PPL | 0017 | [IOPlacer.tcl:266](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.tcl#L266) | ERROR | - | | PPL | 0018 | [IOPlacer.tcl:272](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.tcl#L272) | ERROR | - | | PPL | 0019 | [IOPlacer.tcl:301](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.tcl#L301) | ERROR | - | | PPL | 0020 | [IOPlacer.cpp:1648](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L1648) | ERROR | - | | PPL | 0021 | [IOPlacer.tcl:309](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.tcl#L309) | ERROR | - | | PPL | 0022 | [IOPlacer.tcl:150](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.tcl#L150) | ERROR | - | | PPL | 0023 | [IOPlacer.tcl:327](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.tcl#L327) | ERROR | - | | PPL | 0024 | [IOPlacer.cpp:965](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L965) | ERROR | - | | PPL | 0025 | [IOPlacer.cpp:1933](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L1933) | ERROR | - | | PPL | 0027 | [IOPlacer.tcl:378](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.tcl#L378) | ERROR | - | | PPL | 0028 | [IOPlacer.tcl:393](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.tcl#L393) | ERROR | - | | PPL | 0029 | [IOPlacer.tcl:406](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.tcl#L406) | ERROR | - | | PPL | 0030 | [IOPlacer.tcl:414](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.tcl#L414) | ERROR | - | | PPL | 0031 | [IOPlacer.tcl:239](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.tcl#L239) | ERROR | - | | PPL | 0032 | [IOPlacer.tcl:244](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.tcl#L244) | ERROR | - | | PPL | 0033 | [HungarianMatching.cpp:116](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/HungarianMatching.cpp#L116) | WARN | - | | PPL | 0034 | [IOPlacer.cpp:2618](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L2618) | ERROR | - | | PPL | 0035 | [IOPlacer.cpp:520](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L520) | ERROR | - | | PPL | 0036 | [SimulatedAnnealing.cpp:908](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/SimulatedAnnealing.cpp#L908) | ERROR | - | | PPL | 0038 | [IOPlacer.cpp:3126](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L3126) | WARN | - | | PPL | 0039 | [IOPlacer.cpp:2350](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L2350) | ERROR | - | | PPL | 0040 | [IOPlacer.cpp:997](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L997) | ERROR | - | | PPL | 0042 | [IOPlacer.cpp:1357](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L1357) | WARN | - | | PPL | 0044 | [IOPlacer.cpp:3180](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L3180) | INFO | - | | PPL | 0045 | [IOPlacer.tcl:313](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.tcl#L313) | ERROR | - | | PPL | 0046 | [IOPlacer.tcl:331](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.tcl#L331) | ERROR | - | | PPL | 0049 | [IOPlacer.cpp:551](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L551) | ERROR | - | | PPL | 0050 | [IOPlacer.tcl:431](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.tcl#L431) | ERROR | - | | PPL | 0051 | [IOPlacer.tcl:436](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.tcl#L436) | ERROR | - | | PPL | 0060 | [IOPlacer.cpp:1966](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L1966) | INFO | - | | PPL | 0061 | [IOPlacer.tcl:449](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.tcl#L449) | ERROR | - | | PPL | 0062 | [IOPlacer.cpp:1503](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L1503) | INFO | - | | PPL | 0064 | [IOPlacer.tcl:135](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.tcl#L135) | ERROR | - | | PPL | 0065 | [IOPlacer.tcl:141](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.tcl#L141) | ERROR | - | | PPL | 0066 | [IOPlacer.tcl:164](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.tcl#L164) | ERROR | - | | PPL | 0067 | [IOPlacer.cpp:1951](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L1951) | INFO | - | | PPL | 0068 | [IOPlacer.tcl:168](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.tcl#L168) | ERROR | - | | PPL | 0069 | [IOPlacer.tcl:181](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.tcl#L181) | ERROR | - | | PPL | 0070 | [IOPlacer.cpp:2732](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L2732) | INFO | - | | PPL | 0071 | [IOPlacer.tcl:189](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.tcl#L189) | ERROR | - | | PPL | 0075 | [IOPlacer.cpp:1854](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L1854) | WARN | - | | PPL | 0076 | [IOPlacer.cpp:2034](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L2034) | ERROR | - | | PPL | 0077 | [IOPlacer.cpp:1657](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L1657) | ERROR | - | | PPL | 0078 | [IOPlacer.cpp:1342](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L1342) | WARN | - | | PPL | 0079 | [IOPlacer.cpp:1728](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L1728) | ERROR | - | | PPL | 0082 | [HungarianMatching.cpp:167](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/HungarianMatching.cpp#L167) | ERROR | - | | PPL | 0084 | [IOPlacer.cpp:1838](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L1838) | WARN | - | | PPL | 0086 | [HungarianMatching.cpp:342](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/HungarianMatching.cpp#L342) | ERROR | - | | PPL | 0088 | [IOPlacer.cpp:2311](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L2311) | ERROR | - | | PPL | 0089 | [HungarianMatching.cpp:279](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/HungarianMatching.cpp#L279) | ERROR | - | | PPL | 0090 | [IOPlacer.cpp:201](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L201) | ERROR | - | | PPL | 0091 | [IOPlacer.cpp:292](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L292) | ERROR | - | | PPL | 0092 | [IOPlacer.cpp:2494](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L2494) | WARN | - | | PPL | 0093 | [IOPlacer.cpp:226](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L226) | ERROR | - | | PPL | 0094 | [IOPlacer.cpp:3183](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L3183) | ERROR | - | | PPL | 0097 | [IOPlacer.cpp:372](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L372) | WARN | - | | PPL | 0098 | [IOPlacer.cpp:2108](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L2108) | ERROR | - | | PPL | 0100 | [IOPlacer.cpp:412](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L412) | INFO | - | | PPL | 0101 | [IOPlacer.cpp:318](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L318) | ERROR | - | | PPL | 0102 | [IOPlacer.cpp:2510](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L2510) | WARN | - | | PPL | 0103 | [IOPlacer.cpp:2549](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L2549) | WARN | - | | PPL | 0104 | [IOPlacer.cpp:2137](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L2137) | ERROR | - | | PPL | 0105 | [IOPlacer.cpp:2518](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L2518) | WARN | - | | PPL | 0106 | [IOPlacer.cpp:2463](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L2463) | WARN | - | | PPL | 0107 | [IOPlacer.cpp:2480](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L2480) | ERROR | - | | PPL | 0108 | [IOPlacer.tcl:113](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.tcl#L113) | ERROR | - | | PPL | 0109 | [IOPlacer.cpp:251](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L251) | ERROR | - | | PPL | 0110 | [IOPlacer.cpp:2019](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L2019) | WARN | - | | PPL | 0111 | [IOPlacer.cpp:2046](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L2046) | ERROR | - | | PPL | 0112 | [SimulatedAnnealing.cpp:887](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/SimulatedAnnealing.cpp#L887) | ERROR | - | | PPL | 0113 | [IOPlacer.tcl:232](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.tcl#L232) | WARN | - | | PPL | 0114 | [SimulatedAnnealing.cpp:270](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/SimulatedAnnealing.cpp#L270) | ERROR | - | | PPL | 0115 | [SimulatedAnnealing.cpp:313](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/SimulatedAnnealing.cpp#L313) | ERROR | - | | PPL | 0116 | [SimulatedAnnealing.cpp:327](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/SimulatedAnnealing.cpp#L327) | ERROR | - | | PPL | 0117 | [SimulatedAnnealing.cpp:240](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/SimulatedAnnealing.cpp#L240) | ERROR | - | | PPL | 0121 | [IOPlacer.cpp:1927](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L1927) | ERROR | - | | PPL | 0210 | [HungarianMatching.cpp:86](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/HungarianMatching.cpp#L86) | CRITICAL | - | | PPL | 0211 | [HungarianMatching.cpp:270](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/HungarianMatching.cpp#L270) | CRITICAL | - | | PPL | 9999 | [IOPlacer.cpp:1634](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ppl/src/IOPlacer.cpp#L1634) | WARN | - | | PSM | 0010 | [ir_solver.cpp:1132](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/psm/src/ir_solver.cpp#L1132) | ERROR | - | | PSM | 0011 | [pdnsim.cpp:101](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/psm/src/pdnsim.cpp#L101) | INFO | - | | PSM | 0012 | [ir_solver.cpp:1148](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/psm/src/ir_solver.cpp#L1148) | ERROR | - | | PSM | 0015 | [ir_solver.cpp:757](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/psm/src/ir_solver.cpp#L757) | INFO | - | | PSM | 0020 | [ir_solver.cpp:393](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/psm/src/ir_solver.cpp#L393) | WARN | - | | PSM | 0021 | [ir_solver.cpp:399](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/psm/src/ir_solver.cpp#L399) | ERROR | - | | PSM | 0025 | [ir_solver.cpp:232](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/psm/src/ir_solver.cpp#L232) | ERROR | - | | PSM | 0028 | [pdnsim.tcl:278](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/psm/src/pdnsim.tcl#L278) | ERROR | - | | PSM | 0029 | [pdnsim.tcl:286](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/psm/src/pdnsim.tcl#L286) | ERROR | - | | PSM | 0038 | [ir_solver.cpp:323](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/psm/src/ir_solver.cpp#L323) | WARN | - | | PSM | 0039 | [ir_solver.cpp:349](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/psm/src/ir_solver.cpp#L349) | WARN | - | | PSM | 0040 | [pdnsim.cpp:135](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/psm/src/pdnsim.cpp#L135) | INFO | - | | PSM | 0041 | [ir_solver.cpp:1581](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/psm/src/ir_solver.cpp#L1581) | ERROR | - | | PSM | 0042 | [ir_solver.cpp:282](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/psm/src/ir_solver.cpp#L282) | WARN | - | | PSM | 0047 | [pdnsim.cpp:313](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/psm/src/pdnsim.cpp#L313) | ERROR | - | | PSM | 0048 | [pdnsim.cpp:308](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/psm/src/pdnsim.cpp#L308) | ERROR | - | | PSM | 0055 | [pdnsim.tcl:81](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/psm/src/pdnsim.tcl#L81) | ERROR | - | | PSM | 0057 | [pdnsim.tcl:17](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/psm/src/pdnsim.tcl#L17) | ERROR | - | | PSM | 0058 | [pdnsim.tcl:53](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/psm/src/pdnsim.tcl#L53) | ERROR | - | | PSM | 0059 | [pdnsim.tcl:171](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/psm/src/pdnsim.tcl#L171) | ERROR | - | | PSM | 0062 | [pdnsim.tcl:206](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/psm/src/pdnsim.tcl#L206) | ERROR | - | | PSM | 0063 | [pdnsim.tcl:225](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/psm/src/pdnsim.tcl#L225) | ERROR | - | | PSM | 0069 | [pdnsim.cpp:138](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/psm/src/pdnsim.cpp#L138) | ERROR | - | | PSM | 0070 | [ir_solver.cpp:525](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/psm/src/ir_solver.cpp#L525) | ERROR | - | | PSM | 0071 | [ir_solver.cpp:549](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/psm/src/ir_solver.cpp#L549) | INFO | - | | PSM | 0072 | [ir_solver.cpp:574](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/psm/src/ir_solver.cpp#L574) | INFO | - | | PSM | 0073 | [ir_solver.cpp:624](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/psm/src/ir_solver.cpp#L624) | INFO | - | | PSM | 0074 | [ir_solver.cpp:830](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/psm/src/ir_solver.cpp#L830) | ERROR | - | | PSM | 0075 | [ir_solver.cpp:776](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/psm/src/ir_solver.cpp#L776) | ERROR | - | | PSM | 0079 | [ir_solver.cpp:1323](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/psm/src/ir_solver.cpp#L1323) | ERROR | - | | PSM | 0080 | [ir_solver.cpp:800](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/psm/src/ir_solver.cpp#L800) | ERROR | - | | PSM | 0086 | [ir_network.cpp:113](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/psm/src/ir_network.cpp#L113) | WARN | - | | PSM | 0087 | [ir_network.cpp:39](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/psm/src/ir_network.cpp#L39) | ERROR | - | | PSM | 0089 | [ir_solver.cpp:754](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/psm/src/ir_solver.cpp#L754) | ERROR | - | | PSM | 0090 | [ir_solver.cpp:1510](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/psm/src/ir_solver.cpp#L1510) | ERROR | - | | PSM | 0091 | [ir_solver.cpp:1550](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/psm/src/ir_solver.cpp#L1550) | ERROR | - | | PSM | 0093 | [pdnsim.cpp:341](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/psm/src/pdnsim.cpp#L341) | ERROR | - | | PSM | 0181 | [pdnsim.tcl:122](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/psm/src/pdnsim.tcl#L122) | ERROR | - | | PSM | 0182 | [pdnsim.tcl:115](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/psm/src/pdnsim.tcl#L115) | ERROR | - | | PSM | 0280 | [pdnsim.tcl:144](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/psm/src/pdnsim.tcl#L144) | WARN | - | | RAM | 0002 | [ram.tcl:29](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ram/src/ram.tcl#L29) | ERROR | - | | RAM | 0003 | [ram.cpp:1128](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ram/src/ram.cpp#L1128) | INFO | - | | RAM | 0004 | [ram.i:52](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ram/src/ram.i#L52) | ERROR | - | | RAM | 0005 | [ram.tcl:186](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ram/src/ram.tcl#L186) | ERROR | - | | RAM | 0006 | [ram.tcl:192](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ram/src/ram.tcl#L192) | ERROR | - | | RAM | 0007 | [ram.i:63](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ram/src/ram.i#L63) | ERROR | - | | RAM | 0008 | [ram.i:74](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ram/src/ram.i#L74) | ERROR | - | | RAM | 0009 | [ram.tcl:218](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ram/src/ram.tcl#L218) | ERROR | - | | RAM | 0010 | [ram.cpp:471](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ram/src/ram.cpp#L471) | ERROR | - | | RAM | 0011 | [ram.cpp:86](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ram/src/ram.cpp#L86) | ERROR | - | | RAM | 0012 | [ram.tcl:222](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ram/src/ram.tcl#L222) | ERROR | - | | RAM | 0013 | [ram.tcl:231](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ram/src/ram.tcl#L231) | ERROR | - | | RAM | 0014 | [ram.tcl:235](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ram/src/ram.tcl#L235) | ERROR | - | | RAM | 0015 | [ram.tcl:245](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ram/src/ram.tcl#L245) | ERROR | - | | RAM | 0016 | [ram.cpp:473](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ram/src/ram.cpp#L473) | INFO | - | | RAM | 0017 | [ram.tcl:249](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ram/src/ram.tcl#L249) | ERROR | - | | RAM | 0018 | [ram.tcl:259](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ram/src/ram.tcl#L259) | ERROR | - | | RAM | 0019 | [ram.i:85](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ram/src/ram.i#L85) | ERROR | - | | RAM | 0020 | [ram.tcl:131](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ram/src/ram.tcl#L131) | ERROR | - | | RAM | 0021 | [ram.tcl:80](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ram/src/ram.tcl#L80) | ERROR | - | | RAM | 0022 | [ram.tcl:84](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ram/src/ram.tcl#L84) | WARN | - | | RAM | 0023 | [ram.cpp:1827](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ram/src/ram.cpp#L1827) | ERROR | - | | RAM | 0024 | [ram.cpp:1832](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ram/src/ram.cpp#L1832) | INFO | - | | RAM | 0025 | [ram.cpp:1085](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ram/src/ram.cpp#L1085) | ERROR | - | | RAM | 0026 | [ram.tcl:39](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ram/src/ram.tcl#L39) | ERROR | - | | RAM | 0027 | [ram.tcl:45](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ram/src/ram.tcl#L45) | ERROR | - | | RAM | 0028 | [ram.cpp:571](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ram/src/ram.cpp#L571) | ERROR | - | | RAM | 0029 | [ram.cpp:578](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ram/src/ram.cpp#L578) | ERROR | - | | RAM | 0031 | [ram.cpp:875](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ram/src/ram.cpp#L875) | ERROR | - | | RAM | 0032 | [ram.cpp:885](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ram/src/ram.cpp#L885) | ERROR | - | | RAM | 0033 | [ram.cpp:1092](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ram/src/ram.cpp#L1092) | ERROR | - | | RAM | 0034 | [ram.cpp:1110](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ram/src/ram.cpp#L1110) | ERROR | - | | RAM | 0035 | [ram.cpp:867](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ram/src/ram.cpp#L867) | WARN | - | | RAM | 0036 | [ram.cpp:1101](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ram/src/ram.cpp#L1101) | ERROR | - | | RAM | 0037 | [ram.cpp:1155](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ram/src/ram.cpp#L1155) | ERROR | - | | RAM | 0038 | [ram.cpp:899](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ram/src/ram.cpp#L899) | ERROR | - | | RAM | 0039 | [ram.cpp:907](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ram/src/ram.cpp#L907) | ERROR | - | | RAM | 0040 | [ram.tcl:202](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ram/src/ram.tcl#L202) | ERROR | - | | RAM | 0041 | [ram.tcl:212](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/ram/src/ram.tcl#L212) | ERROR | - | | RCX | 0001 | [ext.cpp:304](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/ext.cpp#L304) | INFO | - | | RCX | 0002 | [ext.cpp:312](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/ext.cpp#L312) | ERROR | - | | RCX | 0003 | [netRC.cpp:2363](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/netRC.cpp#L2363) | WARN | - | | RCX | 0004 | [extmain.cpp:72](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extmain.cpp#L72) | ERROR | - | | RCX | 0005 | [netRC.cpp:2375](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/netRC.cpp#L2375) | WARN | - | | RCX | 0007 | [extBench.cpp:464](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extBench.cpp#L464) | INFO | - | | RCX | 0008 | [netRC.cpp:2359](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/netRC.cpp#L2359) | WARN | - | | RCX | 0009 | [extDefPatterns.cpp:987](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extDefPatterns.cpp#L987) | INFO | - | | RCX | 0010 | [extDefPatterns.cpp:1057](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extDefPatterns.cpp#L1057) | INFO | - | | RCX | 0011 | [extDefPatterns.cpp:1138](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extDefPatterns.cpp#L1138) | INFO | - | | RCX | 0019 | [ext.cpp:362](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/ext.cpp#L362) | INFO | - | | RCX | 0021 | [ext.cpp:415](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/ext.cpp#L415) | INFO | - | | RCX | 0029 | [ext.cpp:169](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/ext.cpp#L169) | INFO | - | | RCX | 0030 | [ext.cpp:180](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/ext.cpp#L180) | ERROR | - | | RCX | 0031 | [ext.cpp:189](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/ext.cpp#L189) | INFO | - | | RCX | 0040 | [netRC.cpp:1904](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/netRC.cpp#L1904) | INFO | - | | RCX | 0042 | [extSpef.cpp:1628](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpef.cpp#L1628) | INFO | - | | RCX | 0043 | [extFlow_v2.cpp:153](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extFlow_v2.cpp#L153) | INFO | - | | RCX | 0044 | [extSpefIn.cpp:2683](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L2683) | WARN | - | | RCX | 0045 | [netRC.cpp:2012](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/netRC.cpp#L2012) | INFO | - | | RCX | 0046 | [find_some_net.cpp:37](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/find_some_net.cpp#L37) | WARN | - | | RCX | 0047 | [extSpef.cpp:1667](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpef.cpp#L1667) | INFO | - | | RCX | 0048 | [extSpefIn.cpp:2674](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L2674) | WARN | - | | RCX | 0049 | [extSpefIn.cpp:2677](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L2677) | WARN | - | | RCX | 0050 | [extSpefIn.cpp:2680](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L2680) | WARN | - | | RCX | 0052 | [extSpefIn.cpp:2687](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L2687) | ERROR | - | | RCX | 0055 | [extBench.cpp:273](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extBench.cpp#L273) | INFO | - | | RCX | 0056 | [extDefPatternsVia.cpp:240](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extDefPatternsVia.cpp#L240) | INFO | - | | RCX | 0057 | [extBench.cpp:333](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extBench.cpp#L333) | INFO | - | | RCX | 0058 | [extBench.cpp:395](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extBench.cpp#L395) | INFO | - | | RCX | 0059 | [extDefPatterns.cpp:911](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extDefPatterns.cpp#L911) | INFO | - | | RCX | 0060 | [extSpefIn.cpp:2630](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L2630) | INFO | - | | RCX | 0065 | [extmain.cpp:652](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extmain.cpp#L652) | INFO | - | | RCX | 0072 | [extRCmodel.cpp:3218](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extRCmodel.cpp#L3218) | INFO | - | | RCX | 0074 | [extmeasure.cpp:64](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extmeasure.cpp#L64) | WARN | - | | RCX | 0076 | [extSpefIn.cpp:572](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L572) | WARN | - | | RCX | 0077 | [extSpefIn.cpp:743](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L743) | WARN | - | | RCX | 0078 | [extSpefIn.cpp:2244](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L2244) | WARN | - | | RCX | 0079 | [extmeasure.cpp:1788](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extmeasure.cpp#L1788) | INFO | - | | RCX | 0081 | [extFlow.cpp:281](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extFlow.cpp#L281) | ERROR | - | | RCX | 0082 | [extFlow.cpp:299](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extFlow.cpp#L299) | ERROR | - | | RCX | 0107 | [netRC.cpp:2020](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/netRC.cpp#L2020) | WARN | - | | RCX | 0110 | [netRC.cpp:629](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/netRC.cpp#L629) | INFO | - | | RCX | 0111 | [netRC.cpp:677](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/netRC.cpp#L677) | WARN | - | | RCX | 0112 | [netRC.cpp:775](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/netRC.cpp#L775) | ERROR | - | | RCX | 0113 | [netRC.cpp:780](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/netRC.cpp#L780) | ERROR | - | | RCX | 0114 | [netRC.cpp:788](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/netRC.cpp#L788) | WARN | - | | RCX | 0115 | [netRC.cpp:795](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/netRC.cpp#L795) | ERROR | - | | RCX | 0117 | [extmain_v2.cpp:787](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extmain_v2.cpp#L787) | WARN | - | | RCX | 0120 | [netRC.cpp:1209](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/netRC.cpp#L1209) | WARN | - | | RCX | 0121 | [netRC.cpp:1357](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/netRC.cpp#L1357) | INFO | - | | RCX | 0122 | [netRC.cpp:1373](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/netRC.cpp#L1373) | INFO | - | | RCX | 0127 | [netRC.cpp:1794](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/netRC.cpp#L1794) | WARN | - | | RCX | 0128 | [netRC.cpp:1835](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/netRC.cpp#L1835) | INFO | - | | RCX | 0129 | [netRC.cpp:1839](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/netRC.cpp#L1839) | WARN | - | | RCX | 0134 | [netRC.cpp:2258](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/netRC.cpp#L2258) | INFO | - | | RCX | 0135 | [netRC.cpp:2183](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/netRC.cpp#L2183) | WARN | - | | RCX | 0136 | [netRC.cpp:2207](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/netRC.cpp#L2207) | INFO | - | | RCX | 0137 | [netRC.cpp:2277](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/netRC.cpp#L2277) | INFO | - | | RCX | 0138 | [extmain.cpp:347](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extmain.cpp#L347) | WARN | - | | RCX | 0139 | [extmain.cpp:339](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extmain.cpp#L339) | WARN | - | | RCX | 0140 | [extmain.cpp:551](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extmain.cpp#L551) | INFO | - | | RCX | 0141 | [extmain.cpp:630](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extmain.cpp#L630) | INFO | - | | RCX | 0142 | [extmain.cpp:642](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extmain.cpp#L642) | INFO | - | | RCX | 0143 | [extmain.cpp:654](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extmain.cpp#L654) | INFO | - | | RCX | 0144 | [ext.cpp:437](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/ext.cpp#L437) | ERROR | - | | RCX | 0145 | [ext.cpp:441](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/ext.cpp#L441) | ERROR | - | | RCX | 0146 | [ext.cpp:474](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/ext.cpp#L474) | ERROR | - | | RCX | 0147 | [ext.cpp:154](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/ext.cpp#L154) | ERROR | - | | RCX | 0148 | [ext.cpp:208](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/ext.cpp#L208) | WARN | - | | RCX | 0150 | [ext.cpp:455](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/ext.cpp#L455) | ERROR | - | | RCX | 0152 | [extprocess.cpp:1108](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extprocess.cpp#L1108) | WARN | - | | RCX | 0153 | [extprocess.cpp:1142](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extprocess.cpp#L1142) | WARN | - | | RCX | 0154 | [extprocess.cpp:1569](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extprocess.cpp#L1569) | WARN | - | | RCX | 0155 | [extprocess.cpp:2080](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extprocess.cpp#L2080) | WARN | - | | RCX | 0156 | [extprocess.cpp:468](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extprocess.cpp#L468) | INFO | - | | RCX | 0157 | [extprocess.cpp:512](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extprocess.cpp#L512) | INFO | - | | RCX | 0158 | [extprocess.cpp:1080](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extprocess.cpp#L1080) | WARN | - | | RCX | 0159 | [extprocess.cpp:1586](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extprocess.cpp#L1586) | ERROR | - | | RCX | 0171 | [extSpef.cpp:235](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpef.cpp#L235) | ERROR | - | | RCX | 0172 | [extSpef.cpp:240](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpef.cpp#L240) | ERROR | - | | RCX | 0175 | [extSpef.cpp:1184](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpef.cpp#L1184) | WARN | - | | RCX | 0176 | [extSpef.cpp:1464](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpef.cpp#L1464) | INFO | - | | RCX | 0178 | [extSpefIn.cpp:2327](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L2327) | INFO | - | | RCX | 0208 | [extRCmodel.cpp:141](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extRCmodel.cpp#L141) | INFO | - | | RCX | 0216 | [extRCmodel.cpp:3230](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extRCmodel.cpp#L3230) | INFO | - | | RCX | 0217 | [extRCmodel.cpp:3236](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extRCmodel.cpp#L3236) | INFO | - | | RCX | 0218 | [extModelGen.cpp:278](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extModelGen.cpp#L278) | INFO | - | | RCX | 0219 | [extRCmodel.cpp:3298](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extRCmodel.cpp#L3298) | INFO | - | | RCX | 0220 | [extModelGen.cpp:219](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extModelGen.cpp#L219) | INFO | - | | RCX | 0221 | [extRCmodel.cpp:3334](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extRCmodel.cpp#L3334) | INFO | - | | RCX | 0222 | [extRCmodel.cpp:3643](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extRCmodel.cpp#L3643) | WARN | - | | RCX | 0223 | [extRCmodel.cpp:3667](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extRCmodel.cpp#L3667) | WARN | - | | RCX | 0226 | [extFlow_v2.cpp:824](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extFlow_v2.cpp#L824) | WARN | - | | RCX | 0227 | [extRCmodel_process.cpp:283](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extRCmodel_process.cpp#L283) | INFO | - | | RCX | 0228 | [extFlow_v2.cpp:849](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extFlow_v2.cpp#L849) | WARN | - | | RCX | 0232 | [extRCmodel_process.cpp:633](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extRCmodel_process.cpp#L633) | INFO | - | | RCX | 0233 | [extRCmodel_process.cpp:560](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extRCmodel_process.cpp#L560) | INFO | - | | RCX | 0234 | [extRCmodel_process.cpp:573](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extRCmodel_process.cpp#L573) | INFO | - | | RCX | 0235 | [extSolverGen.cpp:33](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSolverGen.cpp#L33) | WARN | - | | RCX | 0236 | [extRCmodel_process.cpp:216](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extRCmodel_process.cpp#L216) | INFO | - | | RCX | 0237 | [extRCmodel_process.cpp:226](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extRCmodel_process.cpp#L226) | INFO | - | | RCX | 0238 | [extSolverGen.cpp:235](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSolverGen.cpp#L235) | INFO | - | | RCX | 0239 | [extFlow.cpp:1270](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extFlow.cpp#L1270) | WARN | - | | RCX | 0240 | [extFlow.cpp:1281](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extFlow.cpp#L1281) | WARN | - | | RCX | 0241 | [extSolverGen.cpp:243](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSolverGen.cpp#L243) | INFO | - | | RCX | 0242 | [extSolverGen.cpp:305](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSolverGen.cpp#L305) | INFO | - | | RCX | 0243 | [extSolverGen.cpp:316](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSolverGen.cpp#L316) | INFO | - | | RCX | 0244 | [extSolverGen.cpp:267](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSolverGen.cpp#L267) | INFO | - | | RCX | 0245 | [extSolverGen.cpp:275](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSolverGen.cpp#L275) | INFO | - | | RCX | 0246 | [extSolverGen.cpp:59](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSolverGen.cpp#L59) | INFO | - | | RCX | 0247 | [extRCmodel_process.cpp:293](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extRCmodel_process.cpp#L293) | INFO | - | | RCX | 0248 | [extRCmodel_process.cpp:484](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extRCmodel_process.cpp#L484) | INFO | - | | RCX | 0249 | [extRCmodel.cpp:3321](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extRCmodel.cpp#L3321) | INFO | - | | RCX | 0250 | [extSolverGen.cpp:212](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSolverGen.cpp#L212) | INFO | - | | RCX | 0251 | [extSolverGen.cpp:204](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSolverGen.cpp#L204) | INFO | - | | RCX | 0252 | [extmain.cpp:38](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extmain.cpp#L38) | ERROR | - | | RCX | 0258 | [extSpefIn.cpp:138](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L138) | WARN | - | | RCX | 0259 | [extSpefIn.cpp:170](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L170) | ERROR | - | | RCX | 0260 | [extSpefIn.cpp:446](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L446) | ERROR | - | | RCX | 0261 | [extSpefIn.cpp:626](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L626) | WARN | - | | RCX | 0262 | [extSpefIn.cpp:543](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L543) | ERROR | - | | RCX | 0263 | [extSpefIn.cpp:599](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L599) | ERROR | - | | RCX | 0264 | [extSpefIn.cpp:887](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L887) | WARN | - | | RCX | 0265 | [extSpefIn.cpp:1080](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L1080) | INFO | - | | RCX | 0266 | [extSpefIn.cpp:1133](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L1133) | INFO | - | | RCX | 0267 | [extSpefIn.cpp:1338](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L1338) | INFO | - | | RCX | 0269 | [extSpefIn.cpp:1493](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L1493) | WARN | - | | RCX | 0270 | [extSpefIn.cpp:1534](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L1534) | WARN | - | | RCX | 0271 | [extSpefIn.cpp:1611](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L1611) | WARN | - | | RCX | 0272 | [extSpefIn.cpp:1628](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L1628) | WARN | - | | RCX | 0273 | [extSpefIn.cpp:1673](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L1673) | ERROR | - | | RCX | 0274 | [extSpefIn.cpp:1680](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L1680) | WARN | - | | RCX | 0275 | [extSpefIn.cpp:1688](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L1688) | WARN | - | | RCX | 0276 | [extSpefIn.cpp:1690](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L1690) | WARN | - | | RCX | 0277 | [extSpefIn.cpp:1734](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L1734) | WARN | - | | RCX | 0278 | [extSpefIn.cpp:1761](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L1761) | WARN | - | | RCX | 0279 | [extSpefIn.cpp:1788](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L1788) | WARN | - | | RCX | 0280 | [extSpefIn.cpp:1846](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L1846) | WARN | - | | RCX | 0281 | [extSpefIn.cpp:1902](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L1902) | WARN | - | | RCX | 0282 | [extSpefIn.cpp:1988](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L1988) | WARN | - | | RCX | 0283 | [extSpefIn.cpp:2233](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L2233) | INFO | - | | RCX | 0284 | [extSpefIn.cpp:2241](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L2241) | WARN | - | | RCX | 0285 | [extSpefIn.cpp:2585](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L2585) | WARN | - | | RCX | 0286 | [extSpefIn.cpp:2372](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L2372) | INFO | - | | RCX | 0287 | [extSpefIn.cpp:2392](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L2392) | INFO | - | | RCX | 0288 | [extSpefIn.cpp:2399](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L2399) | INFO | - | | RCX | 0289 | [extSpefIn.cpp:2413](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L2413) | INFO | - | | RCX | 0290 | [extSpefIn.cpp:2423](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L2423) | INFO | - | | RCX | 0291 | [extSpefIn.cpp:2463](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L2463) | INFO | - | | RCX | 0292 | [extSpefIn.cpp:2582](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L2582) | WARN | - | | RCX | 0293 | [extSpefIn.cpp:2701](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L2701) | INFO | - | | RCX | 0294 | [extSpefIn.cpp:2719](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L2719) | INFO | - | | RCX | 0295 | [extSpefIn.cpp:2823](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L2823) | WARN | - | | RCX | 0296 | [extSpefIn.cpp:2853](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L2853) | WARN | - | | RCX | 0297 | [extSpefIn.cpp:2858](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L2858) | WARN | - | | RCX | 0298 | [extSpefIn.cpp:2860](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L2860) | WARN | - | | RCX | 0299 | [dbUtil.cpp:184](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/dbUtil.cpp#L184) | INFO | - | | RCX | 0357 | [OpenRCX.tcl:265](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/OpenRCX.tcl#L265) | ERROR | - | | RCX | 0358 | [extRCmodel.cpp:3224](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extRCmodel.cpp#L3224) | INFO | - | | RCX | 0374 | [extSpefIn.cpp:1596](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L1596) | WARN | - | | RCX | 0375 | [ext.cpp:226](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/ext.cpp#L226) | INFO | - | | RCX | 0376 | [netRC.cpp:2425](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/netRC.cpp#L2425) | INFO | - | | RCX | 0378 | [ext.cpp:158](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/ext.cpp#L158) | ERROR | - | | RCX | 0380 | [ext.cpp:359](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/ext.cpp#L359) | ERROR | - | | RCX | 0381 | [ext.cpp:410](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/ext.cpp#L410) | ERROR | - | | RCX | 0400 | [dbUtil.cpp:281](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/dbUtil.cpp#L281) | WARN | - | | RCX | 0401 | [dbUtil.cpp:284](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/dbUtil.cpp#L284) | WARN | - | | RCX | 0402 | [dbUtil.cpp:334](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/dbUtil.cpp#L334) | WARN | - | | RCX | 0403 | [dbUtil.cpp:361](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/dbUtil.cpp#L361) | WARN | - | | RCX | 0404 | [extSpefIn.cpp:2383](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L2383) | INFO | - | | RCX | 0405 | [extSpefIn.cpp:1780](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L1780) | WARN | - | | RCX | 0406 | [extSpefIn.cpp:1727](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L1727) | WARN | - | | RCX | 0407 | [extSpefIn.cpp:1769](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L1769) | WARN | - | | RCX | 0408 | [dbUtil.cpp:516](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/dbUtil.cpp#L516) | WARN | - | | RCX | 0409 | [dbUtil.cpp:595](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/dbUtil.cpp#L595) | WARN | - | | RCX | 0410 | [extRCmodel_process.cpp:494](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extRCmodel_process.cpp#L494) | INFO | - | | RCX | 0411 | [dbUtil.cpp:609](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/dbUtil.cpp#L609) | WARN | - | | RCX | 0412 | [extRCmodel.cpp:3285](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extRCmodel.cpp#L3285) | INFO | - | | RCX | 0413 | [extRCmodel.cpp:3272](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extRCmodel.cpp#L3272) | INFO | - | | RCX | 0414 | [dbUtil.cpp:519](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/dbUtil.cpp#L519) | WARN | - | | RCX | 0424 | [parse.cpp:40](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/parse.cpp#L40) | ERROR | - | | RCX | 0428 | [parse.cpp:25](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/parse.cpp#L25) | ERROR | - | | RCX | 0429 | [parse.cpp:366](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/parse.cpp#L366) | ERROR | - | | RCX | 0431 | [netRC.cpp:1314](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/netRC.cpp#L1314) | INFO | - | | RCX | 0433 | [netRC.cpp:1290](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/netRC.cpp#L1290) | INFO | - | | RCX | 0434 | [netRC.cpp:1320](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/netRC.cpp#L1320) | INFO | - | | RCX | 0435 | [netRC.cpp:1658](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/netRC.cpp#L1658) | INFO | - | | RCX | 0436 | [netRC.cpp:1877](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/netRC.cpp#L1877) | INFO | - | | RCX | 0437 | [netRC.cpp:89](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/netRC.cpp#L89) | INFO | - | | RCX | 0438 | [netRC.cpp:78](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/netRC.cpp#L78) | INFO | - | | RCX | 0439 | [netRC.cpp:1908](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/netRC.cpp#L1908) | INFO | - | | RCX | 0440 | [netRC.cpp:1919](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/netRC.cpp#L1919) | INFO | - | | RCX | 0441 | [extmain_v2.cpp:338](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extmain_v2.cpp#L338) | INFO | - | | RCX | 0442 | [extFlow.cpp:1238](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extFlow.cpp#L1238) | INFO | - | | RCX | 0443 | [extSpef.cpp:1634](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpef.cpp#L1634) | INFO | - | | RCX | 0444 | [extSpefIn.cpp:2254](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L2254) | INFO | - | | RCX | 0445 | [extSpefIn.cpp:2555](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L2555) | INFO | - | | RCX | 0446 | [extRCmodel_solver.cpp:269](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extRCmodel_solver.cpp#L269) | INFO | - | | RCX | 0447 | [extSpefIn.cpp:2662](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L2662) | WARN | - | | RCX | 0448 | [extSpefIn.cpp:2650](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L2650) | WARN | - | | RCX | 0449 | [extSpefIn.cpp:2708](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L2708) | INFO | - | | RCX | 0450 | [extmain_v2.cpp:212](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extmain_v2.cpp#L212) | INFO | - | | RCX | 0451 | [extSpefIn.cpp:2711](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L2711) | INFO | - | | RCX | 0452 | [extSpefIn.cpp:64](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L64) | WARN | - | | RCX | 0456 | [extmeasure.cpp:898](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extmeasure.cpp#L898) | INFO | - | | RCX | 0458 | [extmeasure.cpp:968](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extmeasure.cpp#L968) | INFO | - | | RCX | 0459 | [extmeasure.cpp:604](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extmeasure.cpp#L604) | INFO | - | | RCX | 0460 | [extmeasure.cpp:74](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extmeasure.cpp#L74) | WARN | - | | RCX | 0463 | [extSpefIn.cpp:2620](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L2620) | INFO | - | | RCX | 0464 | [extSpefIn.cpp:2633](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpefIn.cpp#L2633) | INFO | - | | RCX | 0465 | [extSpef.cpp:1664](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSpef.cpp#L1664) | INFO | - | | RCX | 0468 | [netRC.cpp:1663](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/netRC.cpp#L1663) | ERROR | - | | RCX | 0469 | [extmain_v2.cpp:343](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extmain_v2.cpp#L343) | ERROR | - | | RCX | 0472 | [netRC.cpp:1340](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/netRC.cpp#L1340) | INFO | - | | RCX | 0474 | [netRC.cpp:2145](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/netRC.cpp#L2145) | INFO | - | | RCX | 0475 | [netRC.cpp:2242](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/netRC.cpp#L2242) | INFO | - | | RCX | 0476 | [extmain.cpp:644](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extmain.cpp#L644) | INFO | - | | RCX | 0480 | [netRC.cpp:2443](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/netRC.cpp#L2443) | INFO | - | | RCX | 0485 | [extSolverGen.cpp:722](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extSolverGen.cpp#L722) | INFO | - | | RCX | 0486 | [extRCmodel.cpp:2649](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extRCmodel.cpp#L2649) | INFO | - | | RCX | 0487 | [netRC.cpp:1700](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/netRC.cpp#L1700) | ERROR | - | | RCX | 0488 | [extmain_v2.cpp:358](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extmain_v2.cpp#L358) | ERROR | - | | RCX | 0489 | [extRCmodel.cpp:2822](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extRCmodel.cpp#L2822) | ERROR | - | | RCX | 0491 | [extRCmodel.cpp:3062](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extRCmodel.cpp#L3062) | ERROR | - | | RCX | 0497 | [extmain.cpp:382](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extmain.cpp#L382) | ERROR | - | | RCX | 0501 | [extmain_v2.cpp:169](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extmain_v2.cpp#L169) | INFO | - | | RCX | 0502 | [extmain_v2.cpp:199](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extmain_v2.cpp#L199) | INFO | - | | RCX | 0503 | [extmain_v2.cpp:141](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extmain_v2.cpp#L141) | INFO | - | | RCX | 0504 | [extmain_v2.cpp:146](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extmain_v2.cpp#L146) | INFO | - | | RCX | 0510 | [extmain_v2.cpp:221](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extmain_v2.cpp#L221) | WARN | - | | RCX | 0511 | [extmain_v2.cpp:392](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/extmain_v2.cpp#L392) | INFO | - | | RCX | 0512 | [process_ext.cpp:55](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/process_ext.cpp#L55) | ERROR | - | | RCX | 0513 | [process_ext.cpp:46](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/src/process_ext.cpp#L46) | ERROR | - | | RMP | 0001 | [rmp.tcl:65](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rmp/src/rmp.tcl#L65) | ERROR | - | | RMP | 0002 | [Restructure.cpp:669](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rmp/src/Restructure.cpp#L669) | ERROR | - | | RMP | 0003 | [Restructure.cpp:529](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rmp/src/Restructure.cpp#L529) | ERROR | - | | RMP | 0004 | [Restructure.cpp:321](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rmp/src/Restructure.cpp#L321) | INFO | - | | RMP | 0005 | [Restructure.cpp:693](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rmp/src/Restructure.cpp#L693) | WARN | - | | RMP | 0006 | [Restructure.cpp:256](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rmp/src/Restructure.cpp#L256) | ERROR | - | | RMP | 0007 | [rmp.tcl:81](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rmp/src/rmp.tcl#L81) | WARN | - | | RMP | 0008 | [rmp.tcl:97](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rmp/src/rmp.tcl#L97) | WARN | - | | RMP | 0009 | [Restructure.cpp:493](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rmp/src/Restructure.cpp#L493) | WARN | - | | RMP | 0010 | [Restructure.cpp:643](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rmp/src/Restructure.cpp#L643) | WARN | - | | RMP | 0011 | [Restructure.cpp:329](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rmp/src/Restructure.cpp#L329) | ERROR | - | | RMP | 0049 | [delay_optimization_strategy.cpp:114](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rmp/src/delay_optimization_strategy.cpp#L114) | ERROR | - | | RMP | 0050 | [zero_slack_strategy.cpp:44](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rmp/src/zero_slack_strategy.cpp#L44) | INFO | - | | RMP | 0052 | [annealing_strategy.cpp:69](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rmp/src/annealing_strategy.cpp#L69) | INFO | - | | RMP | 0053 | [annealing_strategy.cpp:70](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rmp/src/annealing_strategy.cpp#L70) | INFO | - | | RMP | 0054 | [annealing_strategy.cpp:92](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rmp/src/annealing_strategy.cpp#L92) | INFO | - | | RMP | 0057 | [annealing_strategy.cpp:85](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rmp/src/annealing_strategy.cpp#L85) | INFO | - | | RMP | 0058 | [slack_tuning_strategy.cpp:157](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rmp/src/slack_tuning_strategy.cpp#L157) | INFO | - | | RMP | 0059 | [slack_tuning_strategy.cpp:163](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rmp/src/slack_tuning_strategy.cpp#L163) | INFO | - | | RMP | 0064 | [genetic_strategy.cpp:59](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rmp/src/genetic_strategy.cpp#L59) | ERROR | - | | RMP | 0065 | [genetic_strategy.cpp:85](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rmp/src/genetic_strategy.cpp#L85) | INFO | - | | RMP | 0066 | [genetic_strategy.cpp:163](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rmp/src/genetic_strategy.cpp#L163) | INFO | - | | RMP | 0067 | [slack_tuning_strategy.cpp:184](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rmp/src/slack_tuning_strategy.cpp#L184) | INFO | - | | RMP | 0068 | [slack_tuning_strategy.cpp:195](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rmp/src/slack_tuning_strategy.cpp#L195) | INFO | - | | RMP | 1032 | [zero_slack_strategy.cpp:69](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rmp/src/zero_slack_strategy.cpp#L69) | WARN | - | | RSZ | 0000 | [IntegratedFixture.cpp:190](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/tst/src/IntegratedFixture.cpp#L190) | WARN | - | | RSZ | 0004 | [Resizer.tcl:992](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.tcl#L992) | ERROR | - | | RSZ | 0008 | [RepairTargetCollector.cc:94](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/RepairTargetCollector.cc#L94) | INFO | - | | RSZ | 0009 | [RepairTargetCollector.cc:682](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/RepairTargetCollector.cc#L682) | ERROR | - | | RSZ | 0020 | [Resizer.tcl:423](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.tcl#L423) | WARN | - | | RSZ | 0022 | [Resizer.cc:1125](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.cc#L1125) | ERROR | - | | RSZ | 0023 | [Resizer.cc:1874](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.cc#L1874) | ERROR | - | | RSZ | 0024 | [Resizer.tcl:457](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.tcl#L457) | WARN | - | | RSZ | 0025 | [OptimizationPolicy.cc:257](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/policy/OptimizationPolicy.cc#L257) | ERROR | - | | RSZ | 0026 | [Resizer.cc:607](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.cc#L607) | INFO | - | | RSZ | 0027 | [Resizer.cc:1232](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.cc#L1232) | INFO | - | | RSZ | 0028 | [Resizer.cc:1370](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.cc#L1370) | INFO | - | | RSZ | 0029 | [Resizer.cc:1204](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.cc#L1204) | INFO | - | | RSZ | 0031 | [Resizer.cc:1342](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.cc#L1342) | INFO | - | | RSZ | 0032 | [RepairHold.cc:445](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/RepairHold.cc#L445) | INFO | - | | RSZ | 0033 | [RepairHold.cc:456](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/RepairHold.cc#L456) | INFO | - | | RSZ | 0034 | [RepairDesign.cc:2389](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/RepairDesign.cc#L2389) | INFO | - | | RSZ | 0035 | [RepairDesign.cc:2392](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/RepairDesign.cc#L2392) | INFO | - | | RSZ | 0036 | [RepairDesign.cc:2396](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/RepairDesign.cc#L2396) | INFO | - | | RSZ | 0037 | [RepairDesign.cc:2400](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/RepairDesign.cc#L2400) | INFO | - | | RSZ | 0039 | [RepairDesign.cc:2403](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/RepairDesign.cc#L2403) | INFO | - | | RSZ | 0040 | [OptimizationPolicy.cc:211](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/policy/OptimizationPolicy.cc#L211) | INFO | - | | RSZ | 0041 | [Resizer.cc:1184](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.cc#L1184) | ERROR | - | | RSZ | 0042 | [Resizer.cc:3786](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.cc#L3786) | INFO | - | | RSZ | 0043 | [OptimizationPolicy.cc:238](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/policy/OptimizationPolicy.cc#L238) | INFO | - | | RSZ | 0045 | [OptimizationPolicy.cc:213](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/policy/OptimizationPolicy.cc#L213) | INFO | - | | RSZ | 0046 | [RepairHold.cc:396](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/RepairHold.cc#L396) | INFO | - | | RSZ | 0047 | [RepairDesign.cc:510](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/RepairDesign.cc#L510) | INFO | - | | RSZ | 0048 | [RepairDesign.cc:513](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/RepairDesign.cc#L513) | INFO | - | | RSZ | 0049 | [OptimizationPolicy.cc:243](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/policy/OptimizationPolicy.cc#L243) | INFO | - | | RSZ | 0050 | [RepairHold.cc:452](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/RepairHold.cc#L452) | ERROR | - | | RSZ | 0051 | [OptimizationPolicy.cc:226](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/policy/OptimizationPolicy.cc#L226) | INFO | - | | RSZ | 0052 | [Resizer.cc:1158](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.cc#L1158) | ERROR | - | | RSZ | 0053 | [OptimizationPolicy.cc:247](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/policy/OptimizationPolicy.cc#L247) | INFO | - | | RSZ | 0058 | [Resizer.tcl:1022](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.tcl#L1022) | INFO | - | | RSZ | 0059 | [OptimizationPolicy.cc:206](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/policy/OptimizationPolicy.cc#L206) | INFO | - | | RSZ | 0060 | [RepairHold.cc:449](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/RepairHold.cc#L449) | ERROR | - | | RSZ | 0062 | [OptimizationPolicy.cc:254](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/policy/OptimizationPolicy.cc#L254) | WARN | - | | RSZ | 0064 | [RepairHold.cc:440](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/RepairHold.cc#L440) | WARN | - | | RSZ | 0065 | [Resizer.tcl:1016](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.tcl#L1016) | WARN | - | | RSZ | 0066 | [RepairHold.cc:438](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/RepairHold.cc#L438) | WARN | - | | RSZ | 0067 | [Resizer.tcl:970](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.tcl#L970) | WARN | - | | RSZ | 0068 | [Resizer.cc:3510](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.cc#L3510) | ERROR | - | | RSZ | 0069 | [Resizer.tcl:915](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.tcl#L915) | WARN | - | | RSZ | 0070 | [Resizer.cc:4521](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.cc#L4521) | ERROR | - | | RSZ | 0072 | [RepairDesign.cc:1384](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/RepairDesign.cc#L1384) | CRITICAL | - | | RSZ | 0073 | [BufferedNet.cc:1169](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/BufferedNet.cc#L1169) | WARN | - | | RSZ | 0074 | [BufferedNet.cc:1154](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/BufferedNet.cc#L1154) | ERROR | - | | RSZ | 0075 | [Rebuffer.cc:2356](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Rebuffer.cc#L2356) | WARN | - | | RSZ | 0076 | [Resizer.tcl:284](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.tcl#L284) | WARN | - | | RSZ | 0078 | [BufferedNet.cc:97](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/BufferedNet.cc#L97) | CRITICAL | - | | RSZ | 0079 | [BufferedNet.cc:141](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/BufferedNet.cc#L141) | CRITICAL | - | | RSZ | 0080 | [BufferedNet.cc:168](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/BufferedNet.cc#L168) | CRITICAL | - | | RSZ | 0081 | [BufferedNet.cc:223](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/BufferedNet.cc#L223) | CRITICAL | - | | RSZ | 0082 | [BufferedNet.cc:418](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/BufferedNet.cc#L418) | CRITICAL | - | | RSZ | 0083 | [RepairDesign.cc:1978](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/RepairDesign.cc#L1978) | CRITICAL | - | | RSZ | 0084 | [Resizer.cc:1390](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.cc#L1390) | WARN | - | | RSZ | 0085 | [Resizer.cc:1290](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.cc#L1290) | WARN | - | | RSZ | 0086 | [Resizer.cc:3308](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.cc#L3308) | ERROR | - | | RSZ | 0087 | [BufferedNet.cc:196](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/BufferedNet.cc#L196) | CRITICAL | - | | RSZ | 0088 | [Resizer.cc:4468](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.cc#L4468) | WARN | - | | RSZ | 0089 | [Resizer.cc:4492](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.cc#L4492) | ERROR | - | | RSZ | 0090 | [PreChecks.cc:62](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/PreChecks.cc#L62) | ERROR | - | | RSZ | 0091 | [SwapPinsGenerator.cc:347](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/move/SwapPinsGenerator.cc#L347) | ERROR | - | | RSZ | 0092 | [BufferedNet.cc:449](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/BufferedNet.cc#L449) | CRITICAL | - | | RSZ | 0093 | [BufferedNet.cc:467](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/BufferedNet.cc#L467) | ERROR | - | | RSZ | 0094 | [SetupLegacyBase.cc:346](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/policy/SetupLegacyBase.cc#L346) | INFO | - | | RSZ | 0095 | [Resizer.tcl:431](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.tcl#L431) | WARN | - | | RSZ | 0096 | [Resizer.cc:2369](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.cc#L2369) | WARN | - | | RSZ | 0097 | [Resizer.cc:596](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.cc#L596) | WARN | - | | RSZ | 0098 | [SetupLegacyBase.cc:343](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/policy/SetupLegacyBase.cc#L343) | INFO | - | | RSZ | 0099 | [SetupLegacyBase.cc:354](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/policy/SetupLegacyBase.cc#L354) | INFO | - | | RSZ | 0100 | [SetupLegacyBase.cc:141](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/policy/SetupLegacyBase.cc#L141) | INFO | - | | RSZ | 0101 | [RepairDesign.cc:117](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/RepairDesign.cc#L117) | ERROR | - | | RSZ | 0102 | [Resizer.tcl:655](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.tcl#L655) | INFO | - | | RSZ | 0103 | [Resizer.tcl:662](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.tcl#L662) | INFO | - | | RSZ | 0104 | [BufferedNet.cc:1078](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/BufferedNet.cc#L1078) | WARN | - | | RSZ | 0105 | [Resizer.tcl:666](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.tcl#L666) | INFO | - | | RSZ | 0106 | [BufferedNet.cc:1071](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/BufferedNet.cc#L1071) | ERROR | - | | RSZ | 0107 | [Resizer.tcl:670](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.tcl#L670) | INFO | - | | RSZ | 0108 | [Resizer.cc:136](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.cc#L136) | ERROR | - | | RSZ | 0110 | [Resizer.cc:6426](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.cc#L6426) | ERROR | - | | RSZ | 0125 | [RecoverPower.cc:211](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/RecoverPower.cc#L211) | ERROR | - | | RSZ | 0130 | [BufferedNet.cc:931](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/BufferedNet.cc#L931) | CRITICAL | - | | RSZ | 0141 | [RecoverPower.cc:208](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/RecoverPower.cc#L208) | INFO | - | | RSZ | 0142 | [RecoverPower.cc:175](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/RecoverPower.cc#L175) | INFO | - | | RSZ | 0143 | [RepairDesign.cc:745](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/RepairDesign.cc#L745) | WARN | - | | RSZ | 0144 | [RepairDesign.cc:950](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/RepairDesign.cc#L950) | CRITICAL | - | | RSZ | 0146 | [Resizer.tcl:674](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.tcl#L674) | INFO | - | | RSZ | 0148 | [Resizer.tcl:678](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.tcl#L678) | INFO | - | | RSZ | 0149 | [Resizer.tcl:165](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.tcl#L165) | WARN | - | | RSZ | 0151 | [ConcreteSwapArithModules.cc:78](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/ConcreteSwapArithModules.cc#L78) | INFO | - | | RSZ | 0152 | [ConcreteSwapArithModules.cc:102](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/ConcreteSwapArithModules.cc#L102) | INFO | - | | RSZ | 0153 | [ConcreteSwapArithModules.cc:128](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/ConcreteSwapArithModules.cc#L128) | INFO | - | | RSZ | 0154 | [ConcreteSwapArithModules.cc:145](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/ConcreteSwapArithModules.cc#L145) | INFO | - | | RSZ | 0155 | [ConcreteSwapArithModules.cc:347](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/ConcreteSwapArithModules.cc#L347) | ERROR | - | | RSZ | 0157 | [ConcreteSwapArithModules.cc:265](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/ConcreteSwapArithModules.cc#L265) | WARN | - | | RSZ | 0158 | [ConcreteSwapArithModules.cc:280](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/ConcreteSwapArithModules.cc#L280) | WARN | - | | RSZ | 0159 | [ConcreteSwapArithModules.cc:285](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/ConcreteSwapArithModules.cc#L285) | WARN | - | | RSZ | 0160 | [ConcreteSwapArithModules.cc:304](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/ConcreteSwapArithModules.cc#L304) | INFO | - | | RSZ | 0161 | [ConcreteSwapArithModules.cc:218](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/ConcreteSwapArithModules.cc#L218) | WARN | - | | RSZ | 0162 | [Resizer.cc:451](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.cc#L451) | ERROR | - | | RSZ | 0163 | [Resizer.cc:455](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.cc#L455) | ERROR | - | | RSZ | 0164 | [Resizer.tcl:778](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.tcl#L778) | ERROR | - | | RSZ | 0166 | [Resizer.tcl:682](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.tcl#L682) | INFO | - | | RSZ | 0167 | [RepairHold.cc:296](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/RepairHold.cc#L296) | ERROR | - | | RSZ | 0168 | [Resizer.cc:2792](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.cc#L2792) | WARN | - | | RSZ | 0169 | [PreChecks.cc:122](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/PreChecks.cc#L122) | ERROR | - | | RSZ | 0170 | [RepairDesign.cc:1672](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/RepairDesign.cc#L1672) | WARN | - | | RSZ | 0200 | [Resizer.tcl:494](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.tcl#L494) | ERROR | - | | RSZ | 0201 | [Resizer.tcl:498](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.tcl#L498) | ERROR | - | | RSZ | 0202 | [Resizer.tcl:502](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.tcl#L502) | ERROR | - | | RSZ | 0205 | [Resizer.cc:6222](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.cc#L6222) | INFO | - | | RSZ | 0206 | [Resizer.cc:6229](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.cc#L6229) | INFO | - | | RSZ | 0207 | [Resizer.cc:6236](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.cc#L6236) | INFO | - | | RSZ | 0211 | [Resizer.tcl:16](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.tcl#L16) | ERROR | - | | RSZ | 0212 | [MoveCommitter.cc:275](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/MoveCommitter.cc#L275) | INFO | - | | RSZ | 0213 | [Resizer.cc:1315](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.cc#L1315) | INFO | - | | RSZ | 0214 | [Resizer.cc:1324](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.cc#L1324) | INFO | - | | RSZ | 0215 | [Resizer.cc:1414](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.cc#L1414) | INFO | - | | RSZ | 0216 | [Resizer.cc:3944](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.cc#L3944) | ERROR | - | | RSZ | 0217 | [Optimizer.cc:146](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Optimizer.cc#L146) | ERROR | - | | RSZ | 0218 | [RepairTargetCollector.cc:1977](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/RepairTargetCollector.cc#L1977) | INFO | - | | RSZ | 0219 | [RepairTargetCollector.cc:1996](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/RepairTargetCollector.cc#L1996) | INFO | - | | RSZ | 0220 | [RepairTargetCollector.cc:2007](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/RepairTargetCollector.cc#L2007) | INFO | - | | RSZ | 0221 | [SetupLegacyBase.cc:890](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/policy/SetupLegacyBase.cc#L890) | INFO | - | | RSZ | 0223 | [Optimizer.cc:180](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Optimizer.cc#L180) | ERROR | - | | RSZ | 0501 | [Rebuffer.cc:1457](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Rebuffer.cc#L1457) | ERROR | - | | RSZ | 1001 | [Rebuffer.cc:115](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Rebuffer.cc#L115) | CRITICAL | - | | RSZ | 1002 | [Rebuffer.cc:155](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Rebuffer.cc#L155) | CRITICAL | - | | RSZ | 1003 | [Rebuffer.cc:1716](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Rebuffer.cc#L1716) | CRITICAL | - | | RSZ | 1004 | [Rebuffer.cc:839](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Rebuffer.cc#L839) | ERROR | - | | RSZ | 1005 | [Rebuffer.cc:1077](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Rebuffer.cc#L1077) | ERROR | - | | RSZ | 1006 | [Rebuffer.cc:186](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Rebuffer.cc#L186) | CRITICAL | - | | RSZ | 1007 | [Rebuffer.cc:1740](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Rebuffer.cc#L1740) | CRITICAL | - | | RSZ | 1008 | [BufferedNet.cc:78](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/BufferedNet.cc#L78) | ERROR | - | | RSZ | 2001 | [Rebuffer.cc:2139](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Rebuffer.cc#L2139) | ERROR | - | | RSZ | 2002 | [Rebuffer.cc:1699](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Rebuffer.cc#L1699) | ERROR | - | | RSZ | 2004 | [Rebuffer.cc:2245](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Rebuffer.cc#L2245) | ERROR | - | | RSZ | 2005 | [Rebuffer.cc:2172](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Rebuffer.cc#L2172) | WARN | - | | RSZ | 2006 | [Rebuffer.cc:89](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Rebuffer.cc#L89) | WARN | - | | RSZ | 2007 | [Rebuffer.cc:738](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Rebuffer.cc#L738) | WARN | - | | RSZ | 2008 | [Rebuffer.cc:687](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Rebuffer.cc#L687) | WARN | - | | RSZ | 2009 | [Rebuffer.cc:845](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Rebuffer.cc#L845) | WARN | - | | RSZ | 2010 | [Rebuffer.cc:407](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Rebuffer.cc#L407) | ERROR | - | | RSZ | 2011 | [Rebuffer.cc:423](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Rebuffer.cc#L423) | ERROR | - | | RSZ | 2020 | [Rebuffer.cc:2337](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Rebuffer.cc#L2337) | WARN | - | | RSZ | 2021 | [Rebuffer.cc:2386](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Rebuffer.cc#L2386) | WARN | - | | RSZ | 2022 | [Rebuffer.cc:2415](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Rebuffer.cc#L2415) | ERROR | - | | RSZ | 2024 | [OptimizationPolicy.cc:98](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/policy/OptimizationPolicy.cc#L98) | WARN | - | | RSZ | 3000 | [Resizer.cc:5249](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.cc#L5249) | ERROR | - | | RSZ | 3001 | [Resizer.cc:5259](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.cc#L5259) | ERROR | - | | RSZ | 3002 | [Resizer.cc:5303](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.cc#L5303) | ERROR | - | | RSZ | 3003 | [Resizer.cc:5318](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.cc#L5318) | ERROR | - | | RSZ | 3004 | [Resizer.cc:5462](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.cc#L5462) | ERROR | - | | RSZ | 3006 | [Resizer.cc:5529](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.cc#L5529) | ERROR | - | | RSZ | 3007 | [Resizer.cc:5344](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.cc#L5344) | ERROR | - | | RSZ | 3008 | [Resizer.cc:5356](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.cc#L5356) | ERROR | - | | RSZ | 3009 | [RepairHold.cc:743](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/RepairHold.cc#L743) | ERROR | - | | RSZ | 3011 | [Resizer.tcl:873](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.tcl#L873) | ERROR | - | | RSZ | 3012 | [Resizer.tcl:878](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.tcl#L878) | ERROR | - | | RSZ | 3013 | [Resizer.tcl:897](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.tcl#L897) | ERROR | - | | RSZ | 3014 | [Resizer.cc:5392](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.cc#L5392) | ERROR | - | | RSZ | 3015 | [Resizer.cc:5501](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.cc#L5501) | WARN | - | | RSZ | 3016 | [Resizer.cc:5516](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.cc#L5516) | ERROR | - | | RSZ | 3017 | [Resizer.cc:5408](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.cc#L5408) | ERROR | - | | RSZ | 3111 | [RecoverPower.cc:234](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/RecoverPower.cc#L234) | INFO | - | | RSZ | 3200 | [DelayEstimatorReporter.cc:210](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/DelayEstimatorReporter.cc#L210) | ERROR | - | | RSZ | 3201 | [DelayEstimatorReporter.cc:235](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/DelayEstimatorReporter.cc#L235) | ERROR | - | | RSZ | 3202 | [DelayEstimatorReporter.cc:321](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/DelayEstimatorReporter.cc#L321) | ERROR | - | | RSZ | 3203 | [Resizer.tcl:815](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.tcl#L815) | ERROR | - | | RSZ | 3204 | [Resizer.tcl:823](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.tcl#L823) | ERROR | - | | RSZ | 3206 | [Resizer.tcl:838](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.tcl#L838) | ERROR | - | | RSZ | 3207 | [Resizer.tcl:842](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/Resizer.tcl#L842) | ERROR | - | | RSZ | 3209 | [DelayEstimatorReporter.cc:250](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/DelayEstimatorReporter.cc#L250) | ERROR | - | | RSZ | 3210 | [DelayEstimator.cc:192](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/DelayEstimator.cc#L192) | WARN | - | | RSZ | 3213 | [DelayEstimatorReporter.cc:1136](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rsz/src/DelayEstimatorReporter.cc#L1136) | ERROR | - | | STA | 0007 | [dbSta.tcl:50](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbSta.tcl#L50) | ERROR | - | | STA | 0072 | [dbSta.cc:798](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbSta.cc#L798) | WARN | - | | STA | 0073 | [dbSta.tcl:54](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbSta.tcl#L54) | ERROR | - | | STA | 0074 | [dbSta.tcl:66](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbSta.tcl#L66) | ERROR | - | | STA | 0203 | [dbSta.cc:1542](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbSta.cc#L1542) | WARN | - | | STA | 1001 | [dbSta.cc:767](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbSta.cc#L767) | ERROR | - | | STA | 2056 | [dbSta.cc:877](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbSta.cc#L877) | ERROR | - | | STA | 2057 | [dbSta.cc:884](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbSta.cc#L884) | ERROR | - | | STA | 2058 | [dbSta.cc:908](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbSta.cc#L908) | WARN | - | | STA | 2065 | [dbReadVerilog.tcl:38](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbReadVerilog.tcl#L38) | WARN | - | | STA | 2301 | [dbSta.cc:972](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/dbSta/src/dbSta.cc#L972) | WARN | - | | STT | 0001 | [SteinerTreeBuilder.tcl:21](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/stt/src/SteinerTreeBuilder.tcl#L21) | ERROR | - | | STT | 0004 | [SteinerTreeBuilder.cpp:225](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/stt/src/SteinerTreeBuilder.cpp#L225) | ERROR | - | | STT | 0005 | [SteinerTreeBuilder.cpp:244](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/stt/src/SteinerTreeBuilder.cpp#L244) | ERROR | - | | STT | 0006 | [SteinerTreeBuilder.tcl:59](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/stt/src/SteinerTreeBuilder.tcl#L59) | ERROR | - | | STT | 0007 | [SteinerTreeBuilder.cpp:306](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/stt/src/SteinerTreeBuilder.cpp#L306) | ERROR | - | | STT | 0008 | [pd.cpp:440](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/stt/src/pdr/src/pd.cpp#L440) | ERROR | - | | STT | 0009 | [pd.cpp:445](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/stt/src/pdr/src/pd.cpp#L445) | ERROR | - | | SYN | 0001 | [synthesis.cpp:44](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/synthesis.cpp#L44) | ERROR | - | | SYN | 0002 | [synthesis.cpp:113](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/synthesis.cpp#L113) | ERROR | - | | SYN | 0003 | [synthesis.cpp:262](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/synthesis.cpp#L262) | ERROR | - | | SYN | 0004 | [synthesis.cpp:244](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/synthesis.cpp#L244) | ERROR | - | | SYN | 0005 | [synthesis.cpp:253](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/synthesis.cpp#L253) | ERROR | - | | SYN | 0007 | [synthesis.cpp:312](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/synthesis.cpp#L312) | ERROR | - | | SYN | 0008 | [synthesis.cpp:271](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/synthesis.cpp#L271) | ERROR | - | | SYN | 0009 | [synthesis.cpp:303](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/synthesis.cpp#L303) | ERROR | - | | SYN | 0010 | [import.cc:66](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/flow/import.cc#L66) | ERROR | - | | SYN | 0011 | [import.cc:77](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/flow/import.cc#L77) | ERROR | - | | SYN | 0012 | [synthesis.cpp:294](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/synthesis.cpp#L294) | ERROR | - | | SYN | 0013 | [sequential_mapper.cc:457](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/flow/sequential_mapper.cc#L457) | ERROR | - | | SYN | 0014 | [synthesis.cpp:285](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/synthesis.cpp#L285) | ERROR | - | | SYN | 0015 | [synthesis.cpp:321](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/synthesis.cpp#L321) | ERROR | - | | SYN | 0016 | [combinational_mapper.cc:1220](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/flow/combinational_mapper.cc#L1220) | ERROR | - | | SYN | 0017 | [combinational_mapper.cc:1247](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/flow/combinational_mapper.cc#L1247) | INFO | - | | SYN | 0020 | [abc.cc:191](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/flow/abc.cc#L191) | INFO | - | | SYN | 0021 | [abc.cc:204](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/flow/abc.cc#L204) | WARN | - | | SYN | 0022 | [abc.cc:209](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/flow/abc.cc#L209) | ERROR | - | | SYN | 0023 | [abc.cc:214](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/flow/abc.cc#L214) | INFO | - | | SYN | 0024 | [synthesis.cpp:330](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/synthesis.cpp#L330) | ERROR | - | | SYN | 0025 | [synthesis.cpp:127](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/synthesis.cpp#L127) | ERROR | - | | SYN | 0026 | [export.cc:103](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/flow/export.cc#L103) | ERROR | - | | SYN | 0027 | [export.cc:182](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/flow/export.cc#L182) | ERROR | - | | SYN | 0028 | [export.cc:217](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/flow/export.cc#L217) | ERROR | - | | SYN | 0029 | [export.cc:251](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/flow/export.cc#L251) | ERROR | - | | SYN | 0030 | [export.cc:266](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/flow/export.cc#L266) | WARN | - | | SYN | 0031 | [export.cc:272](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/flow/export.cc#L272) | INFO | - | | SYN | 0032 | [synthesis.cpp:357](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/synthesis.cpp#L357) | ERROR | - | | SYN | 0033 | [export.cc:36](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/flow/export.cc#L36) | ERROR | - | | SYN | 0034 | [export.cc:229](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/flow/export.cc#L229) | ERROR | - | | SYN | 0040 | [opt_gatefusion.cc:705](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/flow/opt_gatefusion.cc#L705) | INFO | - | | SYN | 0042 | [synthesis.cpp:99](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/synthesis.cpp#L99) | ERROR | - | | SYN | 0043 | [synthesis.cpp:107](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/synthesis.cpp#L107) | INFO | - | | SYN | 0044 | [opt_gatefusion.cc:712](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/flow/opt_gatefusion.cc#L712) | INFO | - | | SYN | 0045 | [opt_gatefusion.cc:715](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/flow/opt_gatefusion.cc#L715) | INFO | - | | SYN | 0047 | [synthesis.cpp:210](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/synthesis.cpp#L210) | ERROR | - | | SYN | 0048 | [synthesis.cpp:216](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/synthesis.cpp#L216) | ERROR | - | | SYN | 0049 | [synthesis.cpp:62](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/synthesis.cpp#L62) | ERROR | - | | SYN | 0051 | [synthesis.cpp:122](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/synthesis.cpp#L122) | ERROR | - | | SYN | 0052 | [synthesis.cpp:339](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/synthesis.cpp#L339) | ERROR | - | | SYN | 0053 | [synthesis.cpp:228](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/synthesis.cpp#L228) | ERROR | - | | SYN | 0054 | [synthesis.cpp:234](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/synthesis.cpp#L234) | ERROR | - | | SYN | 0055 | [synthesis.cpp:88](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/synthesis.cpp#L88) | INFO | - | | SYN | 0056 | [liveness.cc:395](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/flow/liveness.cc#L395) | INFO | - | | SYN | 0057 | [synthesis.cpp:348](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/synthesis.cpp#L348) | ERROR | - | | SYN | 0101 | [Graph.cc:289](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/ir/Graph.cc#L289) | ERROR | - | | SYN | 0102 | [Graph.cc:828](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/ir/Graph.cc#L828) | ERROR | - | | SYN | 0103 | [Graph.cc:860](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/ir/Graph.cc#L860) | ERROR | - | | SYN | 0104 | [Graph.cc:872](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/ir/Graph.cc#L872) | ERROR | - | | SYN | 0105 | [Graph.cc:884](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/ir/Graph.cc#L884) | ERROR | - | | SYN | 0106 | [Graph.cc:895](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/ir/Graph.cc#L895) | ERROR | - | | SYN | 0107 | [Graph.cc:923](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/ir/Graph.cc#L923) | ERROR | - | | SYN | 0108 | [Graph.cc:936](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/ir/Graph.cc#L936) | ERROR | - | | SYN | 0109 | [Graph.cc:949](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/ir/Graph.cc#L949) | ERROR | - | | SYN | 0110 | [Graph.cc:960](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/ir/Graph.cc#L960) | ERROR | - | | SYN | 0111 | [Graph.cc:982](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/ir/Graph.cc#L982) | ERROR | - | | SYN | 0112 | [TritModel.cc:243](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/ir/TritModel.cc#L243) | ERROR | - | | SYN | 1017 | [combinational_mapper.cc:1225](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/syn/src/flow/combinational_mapper.cc#L1225) | ERROR | - | | TAP | 0001 | [tapcell.tcl:42](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/tap/src/tapcell.tcl#L42) | ERROR | - | | TAP | 0002 | [tapcell.tcl:226](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/tap/src/tapcell.tcl#L226) | ERROR | - | | TAP | 0003 | [tapcell.cpp:520](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/tap/src/tapcell.cpp#L520) | INFO | - | | TAP | 0004 | [tapcell.cpp:523](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/tap/src/tapcell.cpp#L523) | INFO | - | | TAP | 0005 | [tapcell.cpp:150](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/tap/src/tapcell.cpp#L150) | INFO | - | | TAP | 0006 | [tapcell.tcl:297](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/tap/src/tapcell.tcl#L297) | ERROR | - | | TAP | 0010 | [tapcell.tcl:154](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/tap/src/tapcell.tcl#L154) | ERROR | - | | TAP | 0011 | [tapcell.tcl:164](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/tap/src/tapcell.tcl#L164) | ERROR | - | | TAP | 0014 | [tapcell.tcl:48](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/tap/src/tapcell.tcl#L48) | WARN | - | | TAP | 0015 | [tapcell.tcl:126](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/tap/src/tapcell.tcl#L126) | WARN | - | | TAP | 0016 | [tapcell.tcl:130](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/tap/src/tapcell.tcl#L130) | WARN | - | | TAP | 0017 | [tapcell.tcl:52](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/tap/src/tapcell.tcl#L52) | WARN | - | | TAP | 0020 | [tapcell.cpp:1202](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/tap/src/tapcell.cpp#L1202) | ERROR | - | | TAP | 0032 | [tapcell.cpp:321](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/tap/src/tapcell.cpp#L321) | WARN | - | | TAP | 0033 | [tapcell.cpp:356](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/tap/src/tapcell.cpp#L356) | ERROR | - | | TAP | 0034 | [tapcell.tcl:208](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/tap/src/tapcell.tcl#L208) | ERROR | - | | TAP | 0035 | [tapcell.i:25](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/tap/src/tapcell.i#L25) | ERROR | - | | TAP | 0100 | [tapcell.tcl:245](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/tap/src/tapcell.tcl#L245) | INFO | - | | TAP | 0101 | [tapcell.tcl:247](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/tap/src/tapcell.tcl#L247) | INFO | - | | TAP | 0102 | [tapcell.tcl:384](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/tap/src/tapcell.tcl#L384) | ERROR | - | | TAP | 0103 | [tapcell.tcl:411](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/tap/src/tapcell.tcl#L411) | ERROR | - | | TAP | 0104 | [tapcell.cpp:1458](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/tap/src/tapcell.cpp#L1458) | ERROR | - | | UPF | 0001 | [upf.cpp:31](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L31) | WARN | - | | UPF | 0002 | [upf.cpp:47](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L47) | WARN | - | | UPF | 0003 | [upf.cpp:63](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L63) | WARN | - | | UPF | 0004 | [upf.cpp:76](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L76) | WARN | - | | UPF | 0005 | [upf.cpp:87](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L87) | WARN | - | | UPF | 0006 | [upf.cpp:104](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L104) | WARN | - | | UPF | 0007 | [upf.cpp:148](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L148) | WARN | - | | UPF | 0008 | [upf.cpp:167](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L167) | WARN | - | | UPF | 0009 | [upf.cpp:186](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L186) | WARN | - | | UPF | 0010 | [upf.cpp:205](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L205) | WARN | - | | UPF | 0011 | [upf.cpp:224](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L224) | WARN | - | | UPF | 0012 | [upf.cpp:248](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L248) | WARN | - | | UPF | 0013 | [upf.cpp:259](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L259) | WARN | - | | UPF | 0014 | [upf.cpp:304](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L304) | WARN | - | | UPF | 0015 | [upf.cpp:315](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L315) | WARN | - | | UPF | 0016 | [upf.cpp:331](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L331) | WARN | - | | UPF | 0017 | [upf.cpp:402](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L402) | WARN | - | | UPF | 0018 | [upf.cpp:420](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L420) | WARN | - | | UPF | 0019 | [upf.cpp:445](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L445) | ERROR | - | | UPF | 0020 | [upf.cpp:464](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L464) | WARN | - | | UPF | 0021 | [upf.cpp:475](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L475) | WARN | - | | UPF | 0022 | [upf.cpp:483](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L483) | WARN | - | | UPF | 0023 | [upf.cpp:503](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L503) | WARN | - | | UPF | 0024 | [upf.cpp:614](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L614) | WARN | - | | UPF | 0025 | [upf.cpp:709](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L709) | WARN | - | | UPF | 0027 | [upf.cpp:826](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L826) | WARN | - | | UPF | 0028 | [upf.cpp:876](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L876) | WARN | - | | UPF | 0029 | [upf.cpp:1274](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L1274) | ERROR | - | | UPF | 0030 | [upf.cpp:968](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L968) | WARN | - | | UPF | 0031 | [upf.cpp:987](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L987) | WARN | - | | UPF | 0032 | [upf.cpp:1389](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L1389) | WARN | - | | UPF | 0033 | [upf.tcl:623](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.tcl#L623) | ERROR | - | | UPF | 0034 | [upf.tcl:629](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.tcl#L629) | ERROR | - | | UPF | 0035 | [upf.cpp:1200](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L1200) | WARN | - | | UPF | 0036 | [upf.tcl:288](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.tcl#L288) | ERROR | - | | UPF | 0037 | [upf.tcl:296](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.tcl#L296) | ERROR | - | | UPF | 0038 | [upf.cpp:1397](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L1397) | WARN | - | | UPF | 0039 | [upf.cpp:1483](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L1483) | WARN | - | | UPF | 0040 | [upf.tcl:357](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.tcl#L357) | ERROR | - | | UPF | 0041 | [upf.cpp:1503](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L1503) | WARN | - | | UPF | 0042 | [upf.cpp:1524](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L1524) | WARN | - | | UPF | 0043 | [upf.i:143](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.i#L143) | ERROR | - | | UPF | 0044 | [upf.cpp:1406](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L1406) | WARN | - | | UPF | 0045 | [upf.cpp:510](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L510) | WARN | - | | UPF | 0053 | [upf.cpp:1094](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L1094) | WARN | - | | UPF | 0054 | [upf.cpp:1156](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L1156) | WARN | - | | UPF | 0055 | [upf.cpp:1176](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L1176) | WARN | - | | UPF | 0056 | [upf.cpp:1235](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L1235) | WARN | - | | UPF | 0057 | [upf.tcl:496](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.tcl#L496) | WARN | - | | UPF | 0059 | [upf.cpp:1544](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L1544) | WARN | - | | UPF | 0060 | [upf.cpp:1567](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L1567) | WARN | - | | UPF | 0061 | [upf.cpp:126](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L126) | WARN | - | | UPF | 0071 | [upf.cpp:819](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.cpp#L819) | WARN | - | | UPF | 0072 | [writer.cpp:24](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/writer.cpp#L24) | ERROR | - | | UPF | 0073 | [upf.tcl:183](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.tcl#L183) | ERROR | - | | UPF | 0075 | [upf.tcl:248](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.tcl#L248) | ERROR | - | | UPF | 0076 | [upf.tcl:254](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.tcl#L254) | ERROR | - | | UPF | 0077 | [upf.tcl:260](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.tcl#L260) | ERROR | - | | UPF | 0078 | [upf.tcl:10](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/upf/src/upf.tcl#L10) | ERROR | - | | UTL | 0001 | [CFileUtils.cpp:19](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/utl/src/CFileUtils.cpp#L19) | ERROR | - | | UTL | 0002 | [CFileUtils.cpp:36](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/utl/src/CFileUtils.cpp#L36) | ERROR | - | | UTL | 0003 | [CFileUtils.cpp:46](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/utl/src/CFileUtils.cpp#L46) | ERROR | - | | UTL | 0004 | [CFileUtils.cpp:67](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/utl/src/CFileUtils.cpp#L67) | ERROR | - | | UTL | 0005 | [ScopedTemporaryFile.cpp:45](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/utl/src/ScopedTemporaryFile.cpp#L45) | ERROR | - | | UTL | 0006 | [ScopedTemporaryFile.cpp:48](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/utl/src/ScopedTemporaryFile.cpp#L48) | INFO | - | | UTL | 0007 | [ScopedTemporaryFile.cpp:52](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/utl/src/ScopedTemporaryFile.cpp#L52) | ERROR | - | | UTL | 0008 | [ScopedTemporaryFile.cpp:60](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/utl/src/ScopedTemporaryFile.cpp#L60) | WARN | - | | UTL | 0009 | [ScopedTemporaryFile.cpp:64](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/utl/src/ScopedTemporaryFile.cpp#L64) | WARN | - | | UTL | 0010 | [Logger.cpp:181](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/utl/src/Logger.cpp#L181) | WARN | - | | UTL | 0011 | [Logger.cpp:83](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/utl/src/Logger.cpp#L83) | ERROR | - | | UTL | 0013 | [Progress.cpp:246](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/utl/src/Progress.cpp#L246) | ERROR | - | | UTL | 0014 | [Progress.cpp:51](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/utl/src/Progress.cpp#L51) | WARN | - | | UTL | 0020 | [TestMetrics.cpp:26](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/utl/test/cpp/TestMetrics.cpp#L26) | WARN | - | | UTL | 0021 | [TestMetrics.cpp:28](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/utl/test/cpp/TestMetrics.cpp#L28) | WARN | - | | UTL | 0070 | [histogram.cpp:27](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/utl/src/histogram.cpp#L27) | ERROR | - | | UTL | 0071 | [histogram.cpp:35](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/utl/src/histogram.cpp#L35) | WARN | - | | UTL | 0072 | [histogram.cpp:58](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/utl/src/histogram.cpp#L58) | WARN | - | | UTL | 0073 | [SuppressStdout.cpp:18](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/utl/src/SuppressStdout.cpp#L18) | ERROR | - | | UTL | 0074 | [SuppressStdout.cpp:26](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/utl/src/SuppressStdout.cpp#L26) | ERROR | - | | UTL | 0075 | [SuppressStdout.cpp:33](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/utl/src/SuppressStdout.cpp#L33) | ERROR | - | | UTL | 0076 | [SuppressStdout.cpp:47](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/utl/src/SuppressStdout.cpp#L47) | ERROR | - | | UTL | 0100 | [Utl.tcl:84](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/utl/src/Utl.tcl#L84) | ERROR | - | | UTL | 0101 | [Utl.tcl:100](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/utl/src/Utl.tcl#L100) | ERROR | - | | UTL | 0102 | [Logger.cpp:331](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/utl/src/Logger.cpp#L331) | ERROR | - | | UTL | 0103 | [metrics_server.cpp:151](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/utl/src/prometheus/metrics_server.cpp#L151) | WARN | - | | UTL | 0104 | [metrics_server.cpp:94](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/utl/src/prometheus/metrics_server.cpp#L94) | INFO | - | | UTL | 0105 | [metrics_server.cpp:105](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/utl/src/prometheus/metrics_server.cpp#L105) | WARN | - | | UTL | 0106 | [metrics_server.cpp:117](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/utl/src/prometheus/metrics_server.cpp#L117) | WARN | - | | UTL | 0107 | [metrics_server.cpp:134](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/utl/src/prometheus/metrics_server.cpp#L134) | WARN | - | | UTL | 0108 | [metrics_server.cpp:138](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/utl/src/prometheus/metrics_server.cpp#L138) | WARN | - | | UTL | 0201 | [ServiceRegistry.cpp:21](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/utl/src/ServiceRegistry.cpp#L21) | ERROR | - | | UTL | 0202 | [ServiceRegistry.cpp:26](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/utl/src/ServiceRegistry.cpp#L26) | ERROR | - | | UTL | 0203 | [ServiceRegistry.cpp:48](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/utl/src/ServiceRegistry.cpp#L48) | ERROR | - | | UTL | 1234 | [logger_max_messages.tcl:3](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/utl/test/logger_max_messages.tcl#L3) | WARN | - | | WEB | 0001 | [web_serve.cpp:292](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/web/src/web_serve.cpp#L292) | INFO | - | | WEB | 0002 | [web_serve.cpp:296](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/web/src/web_serve.cpp#L296) | ERROR | - | | WEB | 0006 | [web_serve.cpp:154](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/web/src/web_serve.cpp#L154) | WARN | - | | WEB | 0010 | [web.cpp:862](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/web/src/web.cpp#L862) | ERROR | - | | WEB | 0011 | [web.cpp:867](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/web/src/web.cpp#L867) | ERROR | - | | WEB | 0017 | [web.cpp:873](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/web/src/web.cpp#L873) | ERROR | - | | WEB | 0018 | [web.cpp:879](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/web/src/web.cpp#L879) | ERROR | - | | WEB | 0020 | [tile_generator.cpp:2737](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/web/src/tile_generator.cpp#L2737) | ERROR | - | | WEB | 0021 | [tile_generator.cpp:2769](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/web/src/tile_generator.cpp#L2769) | ERROR | - | | WEB | 0022 | [tile_generator.cpp:2776](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/web/src/tile_generator.cpp#L2776) | WARN | - | | WEB | 0023 | [tile_generator.cpp:2893](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/web/src/tile_generator.cpp#L2893) | ERROR | - | | WEB | 0024 | [tile_generator.cpp:2898](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/web/src/tile_generator.cpp#L2898) | INFO | - | | WEB | 0025 | [web.tcl:53](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/web/src/web.tcl#L53) | WARN | - | | WEB | 0026 | [web.tcl:61](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/web/src/web.tcl#L61) | ERROR | - | | WEB | 0027 | [web.tcl:68](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/web/src/web.tcl#L68) | ERROR | - | | WEB | 0028 | [web.tcl:102](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/web/src/web.tcl#L102) | ERROR | - | | WEB | 0029 | [web.tcl:73](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/web/src/web.tcl#L73) | ERROR | - | | WEB | 0030 | [web.cpp:1059](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/web/src/web.cpp#L1059) | WARN | - | | WEB | 0031 | [web.cpp:1038](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/web/src/web.cpp#L1038) | ERROR | - | | WEB | 0032 | [web.cpp:1258](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/web/src/web.cpp#L1258) | INFO | - | | WEB | 0033 | [web.cpp:1122](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/web/src/web.cpp#L1122) | INFO | - | | WEB | 0034 | [web.cpp:1146](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/web/src/web.cpp#L1146) | INFO | - | | WEB | 0035 | [web.cpp:1032](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/web/src/web.cpp#L1032) | ERROR | - | | WEB | 0036 | [web_serve.cpp:363](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/web/src/web_serve.cpp#L363) | WARN | - | | WEB | 0037 | [web.tcl:23](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/web/src/web.tcl#L23) | WARN | - | | WEB | 0040 | [request_handler.cpp:1310](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/web/src/request_handler.cpp#L1310) | INFO | - | | WEB | 0041 | [web_serve.cpp:430](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/web/src/web_serve.cpp#L430) | INFO | - | | WEB | 0042 | [web.cpp:1285](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/web/src/web.cpp#L1285) | WARN | - | | WEB | 0043 | [web.cpp:552](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/web/src/web.cpp#L552) | WARN | - | # OpenDB-AddFieldsInDbObjects.html.md # Manually adding new fields in DB Object For example `add_pitchDiag` in object `DbTechLayer`. \*Modifications in these steps need to be done inside user regions, delimited like the below, to avoid being rewritten by the code generator ```cpp // User Code Begin ... // User Code End ```
ActionFileSource Code
1 Add Fields at the .h file dbTechLayer.h In the class _dbTechLayer:
int \_pitchDiag;
2 Increase the current rev number by one dbDatabase.h ```cpp const uint32_t db_schema_minor = 52; ```
3 Define a keyword for the new db rev number dbDatabase.h ```cpp const uint32_t db_schema_add_pitchDiag = 52; ```
4\* Stream in new fields Conditionally upon Schema number dbTechLayer.cpp In the method dbIStream& operator>>: ```cpp if (obj.getDatabase()->isSchema(db_schema_add_pitchDiag)) { stream >> obj._pitchDiag; } ```
5\* Stream out new fields Conditionally upon Schema number dbTechLayer.cpp In the method dbOStream& operator<<: ```cpp if (obj.getDatabase()->isSchema(db_schema_add_pitchDiag)) { stream << obj._pitchDiag; } ```
6\* Diff new fields dbTechLayer.cpp In the method void \_dbTechLayer::differences: ```cpp DIFF_FIELD(_pitchDiag); ```
7\* Diff Out new fields dbTechLayer.cpp In the method void \_dbTechLayer::out: ```cpp DIFF_OUT_FIELD(_pitchDiag); ```
8\* Created access APIs to the fields dbTechLayer.cpp ```cpp int dbTechLayer::getPitchDiag() {...} void dbTechLayer::setPitchDiag( int pitch ) {...} ```
9\* Add new APIs include/db.h In the class dbTechLayer ```cpp int getPitchDiag(); void setPitchDiag( int pitch ); ```
# PULL_REQUEST_TEMPLATE.html.md # Summary [Describe your changes here] # Type of Change - Bug fix - New feature - Breaking change - Refactoring - Documentation update # Impact [How does this change the tool’s behavior?] # Verification - I have verified that the local build succeeds (`./etc/Build.sh`). - I have run the relevant tests and they pass. - My code follows the repository’s formatting guidelines. - I have included tests to prevent regressions. - **I have signed my commits (DCO).** # Related Issues [Link issues here] # README.html.md # OpenROAD [![Build Status](https://jenkins.openroad.tools/buildStatus/icon?job=OpenROAD-Public%2Fmaster)](https://jenkins.openroad.tools/job/OpenROAD-Public/job/master/) [![Coverity Scan Status](https://scan.coverity.com/projects/the-openroad-project-openroad/badge.svg)](https://scan.coverity.com/projects/the-openroad-project-openroad) [![Documentation Status](https://readthedocs.org/projects/openroad/badge/?version=latest)](https://openroad.readthedocs.io/en/latest/?badge=latest) [![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/5370/badge)](https://bestpractices.coreinfrastructure.org/en/projects/5370) ## About OpenROAD OpenROAD is the leading open-source, foundational application for semiconductor digital design. The OpenROAD flow delivers an Autonomous, No-Human-In-Loop (NHIL) flow, 24 hour turnaround from RTL-GDSII for rapid design exploration and physical design implementation. ## OpenROAD Mission [OpenROAD](https://theopenroadproject.org/) eliminates the barriers of cost, schedule risk and uncertainty in hardware design to promote open access to rapid, low-cost IC design software and expertise and system innovation. The OpenROAD application enables flexible flow control through an API with bindings in Tcl and Python. OpenROAD is used in research and commercial applications such as, - [OpenROAD-flow-scripts](https://github.com/The-OpenROAD-Project/OpenROAD-flow-scripts) from [OpenROAD](https://theopenroadproject.org/) - [OpenLane](https://github.com/The-OpenROAD-Project/OpenLane) from [Efabless](https://efabless.com/) - [Silicon Compiler](https://github.com/siliconcompiler/siliconcompiler) from [Zero ASIC](https://www.zeroasic.com/) - [Hammer](https://docs.hammer-eda.org/en/latest/Examples/openroad-nangate45.html) from [UC Berkeley](https://github.com/ucb-bar) - [OpenFASoC](https://github.com/idea-fasoc/OpenFASOC) from [IDEA-FASoC](https://github.com/idea-fasoc) for mixed-signal design flows OpenROAD fosters a vibrant ecosystem of users through active collaboration and partnership through software development and key alliances. Our growing user community includes hardware designers, software engineers, industry collaborators, VLSI enthusiasts, students and researchers. OpenROAD strongly advocates and enables IC design-based education and workforce development initiatives through training content and courses across several global universities, the Google-SkyWater [shuttles](https://platform.efabless.com/projects/public) also includes GlobalFoundries shuttles, design contests and IC design workshops. The OpenROAD flow has been successfully used to date in over 600 silicon-ready tapeouts for technologies up to 12nm. ## Getting Started with OpenROAD-flow-scripts OpenROAD provides [OpenROAD-flow-scripts](https://github.com/The-OpenROAD-Project/OpenROAD-flow-scripts) as a native, ready-to-use prototyping and tapeout flow. However, it also enables the creation of any custom flow controllers based on the underlying tools, database and analysis engines. Please refer to the flow documentation [here](https://openroad-flow-scripts.readthedocs.io/en/latest/). OpenROAD-flow-scripts (ORFS) is a fully autonomous, RTL-GDSII flow for rapid architecture and design space exploration, early prediction of QoR and detailed physical design implementation. However, ORFS also enables manual intervention for finer user control of individual flow stages through Tcl commands and Python APIs. Figure below shows the main stages of the OpenROAD-flow-scripts: Here are the main steps for a physical design implementation using OpenROAD; - `Floorplanning` - Floorplan initialization - define the chip area, utilization - IO pin placement (for designs without pads) - Tap cell and well tie insertion - PDN- power distribution network creation - `Global Placement` - Macro placement (RAMs, embedded macros) - Standard cell placement - Automatic placement optimization and repair for max slew, max capacitance, and max fanout violations and long wires - `Detailed Placement` - Legalize placement - align to grid, adhere to design rules - Incremental timing analysis for early estimates - `Clock Tree Synthesis` - Insert buffers and resize for high fanout nets - `Optimize setup/hold timing` - `Global Routing` - Antenna repair - Create routing guides - `Detailed Routing` - Legalize routes, DRC-correct routing to meet timing, power constraints - `Chip Finishing` - Parasitic extraction using OpenRCX - Final timing verification - Final physical verification - Dummy metal fill for manufacturability - Use KLayout or Magic using generated GDS for DRC signoff ### GUI The OpenROAD GUI is a powerful visualization, analysis, and debugging tool with a customizable Tcl interface. The below figures show GUI views for various flow stages including floorplanning, placement congestion, CTS and post-routed design. #### Floorplan ![ibex_floorplan.webp](main/docs/images/ibex_floorplan.webp) #### Automatic Hierarchical Macro Placement ![Ariane133](main/docs/images/ariane133_mpl2.webp) #### Placement Congestion Visualization ![pl_congestion.webp](main/docs/images/pl_congestion.webp) #### CTS ![clk_routing.webp](main/docs/images/clk_routing.webp) #### Routing ![ibex_routing.webp](main/docs/images/ibex_routing.webp) ### PDK Support The OpenROAD application is PDK independent. However, it has been tested and validated with specific PDKs in the context of various flow controllers. OpenLane supports SkyWater 130nm and GlobalFoundries 180nm. OpenROAD-flow-scripts supports several public and private PDKs including: #### Open-Source PDKs - `GF180` - 180nm - `SKY130` - 130nm - `Nangate45` - 45nm - `ASAP7` - Predictive FinFET 7nm #### Proprietary PDKs These PDKS are supported in OpenROAD-flow-scripts only. They are used to test and calibrate OpenROAD against commercial platforms and ensure good QoR. The PDKs and platform-specific files for these kits cannot be provided due to NDA restrictions. However, if you are able to access these platforms independently, you can create the necessary platform-specific files yourself. - `GF55` - 55nm - `GF12` - 12nm - `Intel22` - 22nm - `Intel16` - 16nm - `TSMC65` - 65nm ## Tapeouts OpenROAD has been used for full physical implementation in over 600 tapeouts in SKY130 and GF180 through the Google-sponsored, Efabless [MPW shuttle](https://efabless.com/open_shuttle_program) and [ChipIgnite](https://efabless.com/) programs. ![shuttle.webp](main/docs/images/shuttle.webp) ### OpenTitan SoC on GF12LP - Physical design and optimization using OpenROAD ![OpenTitan_SoC.webp](main/docs/images/OpenTitan_SoC.webp) ### Continuous Tapeout Integration into CI The OpenROAD project actively adds successfully taped out MPW shuttle designs to the [CI regression testing](https://github.com/The-OpenROAD-Project/OpenLane-MPW-CI). Examples of designs include Open processor cores, RISC-V based SoCs, cryptocurrency miners, robotic app processors, amateur satellite radio transceivers, OpenPower-based Microwatt etc. ## Build OpenROAD To build OpenROAD tools locally on your machine, follow steps from [here](../user/Build.md). ### Third-party dependencies: submodules vs. Bazel BCR OpenROAD ships two build systems, and they source third-party code differently: - **CMake**: CMake has no central registry of versioned dependencies, so third-party sources are vendored as git submodules (see `.gitmodules` and the nested `.gitmodules` files under each submodule). Some of these submodules look like forks but are really just pinned upstream trees; they exist so CMake has a directory to point at. These are upstream mirrors — kept as submodules because that is what CMake can consume. - **Bazel**: prefer the idiomatic options, in order: 1. A module from the [Bazel Central Registry](https://registry.bazel.build/) (`bazel_dep` in `MODULE.bazel`). This is the default — pinned, mirrored, reproducible, and no submodule needed. 2. If the dependency is not on BCR, fetch the upstream repository directly with `http_archive` (preferred) or a module extension. For modules that exist on BCR but need a different revision, `git_override` (pinned by commit) or `archive_override` (pinned by URL + SHA256) can be used. Bring a BUILD overlay only when upstream does not ship one. 3. A real fork (with OpenROAD-specific patches) stays as a git submodule because that is also what CMake needs; Bazel then references it via its local path. The rule of thumb: if Bazel can get it from BCR or directly from the upstream repo, do not add a submodule just for Bazel. Submodules are the CMake-side compromise, not the source of truth for Bazel builds. ## Regression Tests There are a set of executable regression test scripts in `./test/`. ```shell # run tests for all tools ./test/regression # run all flow tests ./test/regression flow # run tests ./test/regression # run all -specific unit tests cd src/ ./test/regression # run only for cd src/ ./test/regression ``` The flow tests check results such as worst slack against reference values. Use `report_flow_metrics [test]...` to see all of the metrics. ```text % report_flow_metrics gcd_nangate45 insts area util slack_min slack_max tns_max clk_skew max_slew max_cap max_fanout DPL ANT drv gcd_nangate45 368 564 8.8 0.112 -0.015 -0.1 0.004 0 0 0 0 0 0 ``` To update a failing regression, follow the instructions below: ```tcl # update log files (i.e. *ok) save_ok # update "*.metrics" for tests that use flow test save_flow_metrics # update "*.metrics_limits" files save_flow_metrics_limits ``` ## Run ```text openroad [-help] [-version] [-no_init] [-exit] [-gui] [-threads count|max] [-log file_name] [-db file_name] cmd_file -help show help and exit -version show version and exit -no_init do not read .openroad init file -threads count|max use count threads -no_splash do not show the license splash at startup -exit exit after reading cmd_file -gui start in gui mode -python start with python interpreter [limited to db operations] -log write a log in -db open a .odb database at startup cmd_file source cmd_file ``` OpenROAD sources the Tcl command file `~/.openroad` unless the command line option `-no_init` is specified. OpenROAD then sources the command file `cmd_file` if it is specified on the command line. Unless the `-exit` command line flag is specified, it enters an interactive Tcl command interpreter. A list of the available tools/modules included in the OpenROAD app and their descriptions are available [here](../contrib/Logger.md#openroad-tool-list). ## Git Quickstart OpenROAD uses Git for version control and contributions. Get familiarised with a quickstart tutorial to contribution [here](../contrib/GitGuide.md). ## Understanding Warning and Error Messages Seeing OpenROAD warnings or errors you do not understand? We have compiled a table of all messages and you may potentially find your answer [here](https://openroad.readthedocs.io/en/latest/user/MessagesFinal.html). ## License BSD 3-Clause License. See [LICENSE](LICENSE) file. # README.html.md # Compose sample ## Prometheus & Grafana Project structure: ```default . ├── compose.yaml ├── grafana │   └── datasource.yml ├── prometheus │   └── prometheus.yml └── README.md ``` [*compose.yaml*](compose.yaml) ```default services: prometheus: image: prom/prometheus ... ports: - 9090:9090 grafana: image: grafana/grafana ... ports: - 3000:3000 ``` The compose file defines a stack with two services `prometheus` and `grafana`. When deploying the stack, docker compose maps port the default ports for each service to the equivalent ports on the host in order to inspect easier the web interface of each service. Make sure the ports 9090 and 3000 on the host are not already in use. # Deploy with docker compose ```default $ docker compose up -d Creating network "prometheus-grafana_default" with the default driver Creating volume "prometheus-grafana_prom_data" with default driver ... Creating grafana ... done Creating prometheus ... done Attaching to prometheus, grafana ``` # Expected result Listing containers must show two containers running and the port mapping as below: ```default $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES dbdec637814f prom/prometheus "/bin/prometheus --c…" 8 minutes ago Up 8 minutes 0.0.0.0:9090->9090/tcp prometheus 79f667cb7dc2 grafana/grafana "/run.sh" 8 minutes ago Up 8 minutes 0.0.0.0:3000->3000/tcp grafana ``` Navigate to `http://localhost:3000` in your web browser and use the login credentials (username=admin, password=grafana) specified in the compose file to access Grafana. It is already configured with prometheus as the default datasource. ![page](docs/images/grafana.png) Navigate to `http://localhost:9090` in your web browser to access directly the web interface of prometheus. Stop and remove the containers. Use `-v` to remove the volumes if looking to erase all data. ```default $ docker compose down -v ``` # README.html.md Source: https://github.com/charlietangora/gif-h 70b645280d5e687f5217177c9cfa2889b0a2ad5f Changes: - modified GifWriter from typedef struct to struct. # gif-h This one-header library offers a simple, very limited way to create animated GIFs directly in code. Those looking for particular cleverness are likely to be disappointed; it’s pretty much a straight-ahead implementation of the GIF format with optional Floyd-Steinberg dithering. (It does at least use delta encoding - only the changed portions of each frame are saved.) So resulting files are often quite large. The hope is that it will be handy nonetheless as a quick and easily-integrated way for programs to spit out animations. Only RGBA8 is currently supported as an input format. (The alpha is ignored.) Email me : ctangora -at- gmail -dot- com ## Usage: Create a GifWriter struct. Pass the struct to GifBegin() to initialize values and write the file header. Pass frames of the animation to GifWriteFrame(). Finally, call GifEnd() to close the file handle and free memory. ```none #include #include #include int main() { int width = 100; int height = 200; std::vector black(width * height * 4, 0); std::vector white(width * height * 4, 255); auto fileName = "bwgif.gif"; int delay = 100; GifWriter g; GifBegin(&g, fileName, width, height, delay); GifWriteFrame(&g, black.data(), width, height, delay); GifWriteFrame(&g, white.data(), width, height, delay); GifEnd(&g); return 0; } ``` # README.html.md # linenoise (vendored) Source: [https://github.com/antirez/linenoise](https://github.com/antirez/linenoise) at tag `2.0`. License: BSD-2-Clause (see `LICENSE`). Used by OpenROAD’s interactive CLI Tcl REPL (`src/tcl_readline_setup.cc`) — replaces the previous tclreadline + GNU readline stack (the latter was GPL). ## Local divergence from upstream `linenoise.c` `completeLine()` has been patched to use **readline-style list-display TAB completion** instead of upstream’s cycle-through-candidates behavior: - **0 candidates** → beep. - **1 candidate** → insert it. - **N>1, common prefix advances the buffer** → advance buffer to the longest common prefix, no list yet. - **N>1, no further common prefix** → print the list of candidates below the prompt, then redraw the prompt + current buffer. This matches what users had with tclreadline. Search the file for `OpenROAD list-display` to locate the patched section. # README.html.md # Install smoke test Verifies that the binary produced by `//packaging:tarfile` starts correctly after extraction (Tcl initialisation, runfiles resolution, etc.). ## Running ```sh bazelisk test //test/install/... ``` ## What it checks 1. Extracts the packaging tarball into a temporary directory (same layout that `bazelisk run //packaging:install` produces). 2. Launches the binary with a trivial Tcl script (`puts "install_test_ok"`). 3. Asserts the expected output appears, proving Tcl initialised and the interpreter is functional. 4. Runs the real `bazel/install.sh` inside a self-contained fake workspace (fake `bazel info bazel-bin`, a minimal tarball, synthetic desktop/icon sources) to verify its cleanup logic: stale binary runfiles are removed on re-install, the GUI launcher + icon are installed and refreshed for a GUI build, and the stale launcher + icon are removed when a later install is not a GUI build. ## Background The installed binary relies on Bazel runfiles for Tcl library files (`init.tcl`, tclreadline, etc.). These live under `openroad.runfiles/_main/bazel/tcl_resources_dir/`. If the runfiles tree is damaged during packaging or installation the binary fails with `application-specific initialization failed:` (GitHub issue #10115). # README.html.md # ORFS smoke tests A set of ORFS integration tests that runs in a few minutes suitable for inclusion in the local fast regression testing workflow prior to creating a PR: ```none bazelisk test ... ``` ## Updating RULES_JSON files 1. Run `bazelisk run //test/orfs/gcd:gcd_update` to update RULES_JSON file for a design. This will build and run OpenROAD to generate a new RULES_JSON file and update the RULES_JSON source file. 2. Create commit for RULES_JSON file ## Updating all RULES_JSON files Oneliner that runs tests, which builds all prerequisites in parallel, then update all the rules: ```none bazelisk test test/orfs/... && bazelisk query test/orfs/... | grep _update\$ | xargs -n1 bazelisk run ``` ## Updating ORFS and bazel-orfs `bazelisk run @bazel-orfs//:bump`, will find the latest bazel-orfs and ORFS docker image and update MODULE.bazel and MODULE.bazel.lock. Note that this update is needed infrequently because the compability between ORFS and OpenROAD only needs to be considered for `bazelisk test/orfs/...` tests. bazel-orfs is updated at the same time as ORFS with the command above. bazel-orfs must sometimes be updated due to changes in the ORFS interface(such as variables.yaml updates or names of output files). # Tips on debugging bazel-orfs failures ## Search logs from top Search for “error:” in logs from the top and you might find somethin like, or more specifically “error executing Action”: ```none [2025-07-15T21:13:48.963Z] (21:13:48) ERROR: /tmp/workspace/OpenROAD-Public_PR-7814-head/test/orfs/mock-array/BUILD:169:10: Action test/orfs/mock-array/results/asap7/Element/base/3_place.odb failed: (Exit 2): bash failed: error executing Action command (from target //test/orfs/mock-array:Element_place) /bin/bash -c ... (remaining 5 arguments skipped) ``` Notice `from target //test/orfs/mock-array:Element_place`. From bottom you again find “error executing Action” and the relevant action: ```none 21:13:48 [ERROR GPL-0305] RePlAce diverged during gradient descent calculation, resulting in an invalid step length (Inf or NaN). This is often caused by numerical instability or high placement density. Consider reducing placement density to potentially resolve the issue. 21:13:48 Error: global_place_skip_io.tcl, 12 GPL-0305 21:13:48 Command exited with non-zero status 1 21:13:48 Elapsed time: 0:40.32[h:]min:sec. CPU time: user 841.13 sys 49.36 (2208%). Peak memory: 157856KB. 21:13:48 (21:13:48) [11,295 / 11,319] 777 / 782 tests, 1 failed; checking cached actions 21:13:48 (21:13:48) ERROR: /tmp/workspace/OpenROAD-Public_PR-7814-head/test/orfs/mock-array/BUILD:116:10 Middleman _middlemen/test_Sorfs_Smock-array_Smake_UMockArray_Utest_Ubase_Utest-runfiles failed: (Exit 2): bash failed: error executing Action command (from target //test/orfs/mock-array:Element_place) /bin/bash -c ... (remaining 5 arguments skipped) 21:13:48 ``` ## Debugging an ORFS stage Debugging using the Bazel `--sandbox_debug` is possible, but not terribly convenient. bazel-orfs has a debug feature specifically to debug stages and create standalone issues. First set up a folder with the necessary dependencies: ```none bazelisk run //:deps -- //test/orfs/mock-array:Element_place ``` This sets up a `tmp/test/orfs/mock-array/Element_place_deps/make` script that calls `make` on the ORFS setup. Since the place stage failed, build all place sub-stages up to the failing stage: ```none tmp/test/orfs/mock-array/Element_place_deps/make do-place ``` Now create a standalone issue: ```none tmp/test/orfs/mock-array/Element_place_deps/make global_place_skip_io_issue ``` The `WORK_HOME` is in `tmp/test/orfs/mock-array/Element_place_deps/_main`: ```none Archiving issue to global_place_skip_io_Element_asap7_base_2025-07-16_08-44.tar.gz Using pigz to compress tar file ``` ## Using a local ORFS bazel-orfs can set up ORFS design files locally for debugging purposes, leaving bazel-orfs entirely out of the equation when chasing down issues. Such a setup is most often a lot more convenient than using `--sandbox_debug`. NOTE! keep in mind that the `//:deps` wrapper deploys dependencies for a particular stage only. Hence, use the `do-` prefix for doing `do-place`, `do-2_1_floorplan`, etc. so that `make` dependency checking is not used. If you use `make floorplan`, this will try to run synthesis first and not find the prerequisite files, nor variables in config.mk, for synthesis and it will fail with bogus and confusing error messages. If you’re interested in some other stage, replace `place` with `synth`, `floorplan`, `cts`, `grt`, `route` or `final` below. The `make` script, if `FLOW_HOME` is set, will use a local ORFS and OpenROAD built by CMake: ```none $ . ~/OpenROAD-flow-scripts/env.sh $ tmp/test/orfs/mock-array/Element_place_deps/make print-FLOW_HOME print-OPENROAD_EXE [deleted] FLOW_HOME = /home//OpenROAD-flow-scripts/flow OPENROAD_EXE = /home//OpenROAD-flow-scripts/tools/install/OpenROAD/bin/openroad ``` More explicitly ORFS only: ```none make --file=~/OpenROAD-flow-scripts/flow/Makefile -C tmp/test/orfs/mock-array/Element_place_deps/_main WORK_HOME=test/orfs/mock-array DESIGN_CONFIG=config.mk do-place ``` This is more verbose, but eliminates any concerns about what the `make` script might be doing differently than ORFS only. ## Running a `make issue` with `cfg=exec` configuration TL;DR, `bazelisk test ...` builds and uses the `cfg=exec` configuration when setting up paths: ```none export PATH=/home//OpenROAD-flow-scripts/tools/OpenROAD/bazel-out/k8-opt-exec-ST-d57f47055a04/bin:$PATH $ ./run-me-Element-asap7-base.sh [deleted] [INFO GPL-1013] Final placement area: 94.65 (+0.00%) [ERROR GPL-0305] RePlAce diverged during gradient descent calculation, resulting in an invalid step length (Inf or NaN). This is often caused by numerical instability or high placement density. Consider reducing placement density to potentially resolve the issue. Error: global_place_skip_io.tcl, 12 GPL-0305 ``` ## Adding `tags = ["manual"]` and `test_kwargs = ["orfs"]` to BUILD files In OpenROAD, `bazelisk build ...` should not build ORFS targets, only OpenROAD binaries. Since bazel-orfs also has build targets, builds in Bazel can build anything, not just executables, the policy in OpenROAD is to mark non-binary build targets as `tags = ["manual"]`. To hunt down missing `tags = ["manual"]` run a query like: ```none bazelisk query 'kind(".*", //test/orfs/mock-array/...) except attr(tags, "manual", //test/orfs/mock-array/...)' ``` Note that OpenROAD *does* want `bazelisk test ...` to run all tests, so test targets should be marked `tags = ["orfs"]` instead, so that `.bazelrc` can skip builds of those targets with the `build --build_tag_filters=-orfs` line. ## Using whittle.py to minimize .odb files While sv-bugpoint minimizes Verilog source files, `whittle.py` minimizes `.odb` database files by iteratively removing instances and nets. This is useful when the bug is in placement, routing, or other physical stages where Verilog reduction would not help. See Bazel.md for detailed instructions and recommended flags. # README.html.md # mock-array test case A parameterized 2D array of identical processing elements (`Element`), each containing four multipliers with registered crossbar routing. The design exercises OpenROAD’s handling of macro-dominated floorplans, hierarchical synthesis, and repeated-macro placement. ## Why mock-array exists mock-array is deliberately simple RTL that nonetheless stresses corners of the physical design flow that production SoCs hit: large counts of identical macros, tight macro-to-macro spacing, hierarchical power reporting, and equivalence checking across synthesis and P&R. Because the design is self-contained and fast to build, it runs in CI on every pull request and catches regressions that would otherwise escape unit tests. ## Bugs exposed by mock-array ### Macro placer (MPL/RTLMP) mock-array’s regular grid of 16-64 identical macros plus negligible standard cell logic is an extreme but valid topology. It has driven multiple MPL fixes: - **Boundary push corner case** – the placer’s “pusher” shoved macros toward core edges, destroying the array. Fixed by detecting a single centralized macro array and skipping the push (`d1dd49a964`). - **Exchange swap probability** – simulated annealing swaps are no-ops when macros are identical. Fix: scale exchange probability by the fraction of identical macros (`52c6ce2128`, issue #3875). - **SA perturbation count** – the perturbation budget was too low for 64-macro clusters, preventing convergence (`f7cbe0a86d`). - **Fine shaping with a single std cell cluster** – the shaper didn’t shrink the negligible std cell cluster, leaving it large enough to displace macros (`2ae90677cd`). - **SA centralization revert** – reverting centralization on cost increase prevented convergence for the single-array-single-std-cell pattern (`38bf6edce2`). - **Pin access blockages** – making blockages hard constraints consumed enough area to make mock-array infeasible; fix: shrink pin access area when needed (PR #8438, issue #8366). ### Clock tree synthesis - CTS produces large clock skew in macro-dominated designs, causing massive hold violations (issues #8255, #8516, #4989). mock-array requires a `-30 ps` hold slack margin workaround. ### Hierarchical flow mock-array is the primary test vehicle for `read_db -hier` and hierarchical power reporting. It has exposed: - Crash in `vt_swap` after `read_db -hier` (issue #8141). - Missing `reg2reg` path group with hierarchical DB (issue #8166). - No TAPCELL insertion in hierarchical flow (issue #8254). - Net name mismatch between netlist and SPEF (issues #8297, #8551). - Incremental vs full STA timing mismatch post-CTS (issue #8240). ### Other tools - `read_vcd` segfault in STA on mock-array power test (issue #8857). - `write_macro_placement` didn’t Tcl-escape special characters in macro names (`475eb39584`). - Verilator reported 17k UNDRIVEN warnings on hierarchical output (issue #8108). ## What mock-array does NOT test The design is intentionally simple. These areas need other test cases: - **Irregular hierarchies** – mock-array is a perfectly regular NxN grid. Designs with mixed macro sizes, deep nesting, or irregular connectivity exercise different MPL code paths (e.g. segfaults on fazyrv #7616, darksocv #9251). - **Multiple clock domains** – single-clock design; CTS and STA bugs involving clock domain crossings are invisible. - **Routing congestion** – macro-dominated with light standard cell routing. DRT bugs under heavy congestion (e.g. megaboom #6066) are not tested. - **Technology portability** – runs on ASAP7 only. PDK-specific bugs (GF180, IHP130, SKY130) are missed. - **Large scale** – 4x4 and 8x8 configurations are small. Bugs that manifest only at thousands of macros or millions of cells are missed. - **Analog/mixed-signal** – no ring macros, 90-degree rotation, or complex placement blockage interactions. - **Detailed placement** – macro-dominated; standard cell DPL bugs (e.g. `improve_placement` #9862) would not be caught. - **IO pads / flipchip** – simple pin placement; pad-related PDN, RDL routing, and bump assignment bugs are not tested. ## Design structure ```default MockArray (parameterized WIDTH x HEIGHT) +-- Element[r][c] (concrete wrapper, synthesized as macro) +-- ElementInner (parameterized DATA_WIDTH, COLS) +-- Multiplier x4 (crossbar: left/up/right/down) | +-- multiplier (Amaranth gate-level blackbox) +-- LSB chain (shift register with periodic register breaks) ``` Each `Element` registers all four directional inputs, feeds them through a crossbar of four multipliers, and registers the outputs. A LSB chain shifts bits left-to-right across columns with a register break every `COLS/2` positions. ## Configurations | Config | Rows | Cols | Elements | Multipliers | |----------|--------|--------|------------|---------------| | 4x4 | 4 | 4 | 16 | 64 | | 8x8 | 8 | 8 | 64 | 256 | ## Build variants - **`base`** – hierarchical: `Element` is synthesized and placed as a hard macro, then instantiated inside `MockArray`. Tests hierarchical synthesis, abstract generation, macro placement, and hierarchical power reporting. - **`flat`** – flat synthesis of the entire design. Tests standard flat flow and Verilator simulation for VCD-based power analysis. ## Synthesis flow Hierarchical synthesis uses three separate Yosys runs stitched together: 1. `Element` RTL synthesized with **slang** frontend (multiplier blackboxed). 2. `multiplier.v` (Amaranth-generated) synthesized with **native Yosys** frontend (slang doesn’t support the behavioral Verilog style). 3. Netlists concatenated into a combined Element netlist. 4. `MockArray` RTL synthesized with slang (both Element and multiplier blackboxed), then combined with the Element and multiplier netlists. ## Running tests ```bash # Quick: analysis only (no build), checks for Bazel conflicts bazelisk build --nobuild //test/orfs/mock-array:all # Medium: synthesis only bazelisk build //test/orfs/mock-array:MockArray_4x4_slang_synth bazelisk build //test/orfs/mock-array:Element_4x4_slang_synth # Full: place-and-route (takes minutes) bazelisk test //test/orfs/mock-array:MockArray_4x4_base_test bazelisk test //test/orfs/mock-array:MockArray_4x4_flat_test ``` # README.html.md # Summary Simple GCD (greatest common denominator) core. This is an extremely small design mostly used to test the sanity of the flow. Originally generated using [PyMTL](https://github.com/cornell-brg/pymtl). This design has about 250 cells. ## Source Re-used code derived from http://opencelerity.org/ project. ## Whittle test The `gcd_whittle_test` is an integration test for `etc/whittle.py`, the delta-debugging tool that minimises `.odb` files. It reuses the floorplan `.odb` produced by the gcd flow and repeatedly runs global placement (`global_placement -density 0.35 -skip_io`) while whittle removes instances and nets until iteration 100 is no longer reached. ```none bazelisk test //test/orfs/gcd:gcd_whittle_test ``` # README.html.md # Hacked asap7 files These are a few asap7 files hacked and slashed until eqy was able to parse them, hence a copy here specific to the tests in this module. # README.html.md # OpenROAD API OpenROAD can be run using Tcl, and Python (limited support). The following commands are used to read and write design data. Tcl ```tcl read_lef [-tech] [-library] filename read_def filename write_def [-version 5.8|5.7|5.6|5.5|5.4|5.3] filename read_verilog filename write_verilog filename read_db filename write_db filename write_abstract_lef filename ``` Python ```python # read_verilog, write_verilog and write_abstract_lef are not supported in Python. read_lef(db: odb.dbDatabase, path: str) -> odb.dbLib read_def(tech: odb.dbTech, path: str) -> odb.dbChip write_def(block: dbBlock, path: str, version: Optional[odb.defout.Version]) -> int read_db(db: odb.dbDatabase, db_path: str) -> odb.dbDatabase write_db(db: odb.dbDatabase, db_path: str) -> int ``` Use the Tcl `source` command to read commands from a file. Tcl ```tcl source [-echo] file ``` Python ```py # Source is not supported in Python. # Instead run this at the start: openroad -python script.py ``` If an error is encountered in a command while reading the command file, then the error is printed and no more commands are read from the file. If `file_continue_on_error` is `1` then OpenROAD will continue reading commands after the error. If `exit_on_error` is `1` then OpenROAD will exit when it encounters an error. OpenROAD can be used to make a OpenDB database from LEF/DEF, or Verilog (flat or hierarchical). Once the database is made it can be saved as a file with the `write_db` command. OpenROAD can then read the database with the `read_db` command without reading LEF/DEF or Verilog. The `read_lef` and `read_def` commands can be used to build an OpenDB database as shown below. The `read_lef -tech` flag reads the technology portion of a LEF file. The `read_lef -library` flag reads the MACROs in the LEF file. If neither of the `-tech` and `-library` flags are specified they default to `-tech -library` if no technology has been read and `-library` if a technology exists in the database. Tcl ```tcl read_lef liberty1.lef read_def reg1.def # Write the db for future runs. write_db reg1.db ``` Python ```py from openroad import Design, Tech tech = Tech() tech.readLef("liberty1.lef") design = Design(tech) design.readDef("reg1.def") # Write the db for future runs. design.writedb("reg1.db") ``` The `read_verilog` command is used to build an OpenDB database as shown below. Multiple Verilog files for a hierarchical design can be read. The `link_design` command is used to flatten the design and make a database. Tcl ```tcl read_lef liberty1.lef read_verilog reg1.v link_design top # Write the db for future runs. write_db reg1.db ``` Python ```py # Not supported in Python ``` ## Example scripts Example scripts demonstrating how to run OpenROAD on sample designs can be found in `/test`. Flow tests taking sample designs from synthesizable RTL Verilog to detail-routed final layout in the open-source technologies Nangate45 and Sky130HD are shown below. ```shell gcd_nangate45.tcl aes_nangate45.tcl tinyRocket_nangate45.tcl gcd_sky130hd.tcl aes_sky130hd.tcl ibex_sky130hd.tcl ``` Each of these designs use the common script `flow.tcl`. ## Read database file To read a database from disk. ```tcl read_db filename ``` ### Options | Switch Name | Description | |---------------|-----------------------------| | `filename` | Path to the file to be read | ### Examples ```default read_db reg1.db ``` ## Write database file To write a database to disk. ```tcl write_db filename ``` ### Options | Switch Name | Description | |---------------|---------------------------------------------------------------------------------------------------------| | `filename` | Path to the file to be written, if the filename ends with `.gz` the file will be compressed using gzip. | ### Examples ```default write_db reg1.db # To write a database file with gzip compression. write_db reg1.db.gz ``` ## Abstract LEF Support OpenROAD contains an abstract LEF writer that can take your current design and emit an abstract LEF representing the external pins of your design and metal obstructions. ```tcl write_abstract_lef (-bloat_factor bloat_factor|-bloat_occupied_layers) \ filename ``` ### Options | Switch Name | Description | |--------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-bloat_factor` | Specifies the bloat factor used when bloating then merging shapes into LEF obstructions. The factor is measured in # of default metal pitches for the respective layer. A factor of `0` will result in detailed LEF obstructions | | `-bloat_occupied_layers` | Generates cover obstructions (obstructions over the entire layer) for each layer where shapes are present | ### Examples ```default read reg1.db # Bloat metal shapes by 3 pitches (respectively for every layer) and then merge write_abstract_lef -bloat_factor 3 reg1_abstract.lef # Produce cover obstructions for each layer with shapes present write_abstract_lef -bloat_occupied_layers reg1_abstract.lef ``` ## Write CDL netlist To export the CDL netlist to disk. ```tcl write_cdl -masters list_of_cdl_files [-include_fillers] filename ``` ### Options | Switch Name | Description | |----------------------|---------------------------------------------------------------------------------------------------------| | `-masters` | List of CDL netlist dependencies. | | `[-include_fillers]` | Export fillers to the CDL netlist | | `filename` | Path to the file to be written, if the filename ends with `.gz` the file will be compressed using gzip. | ### Examples ```default write_cdl -masters {netlist1.cdl netlist2.cdl ...} -include_fillers netlist.cdl # To write a database file with gzip compression. write_cdl -masters {netlist1.cdl netlist2.cdl ...} -include_fillers netlist.cdl.gz ``` ### Global Connections #### Add global connections The `add_global_connection` command is used to specify how to connect power and ground pins on design instances to the appropriate supplies. ```default add_global_connection -net net_name \ [-inst_pattern inst_regular_expression] \ -pin_pattern pin_regular_expression \ (-power|-ground) \ [-region region_name] ``` ##### Options | Switch Name | Description | |-----------------|-------------------------------------------------------------------------------------------------------| | `-net` | Specifies the name of the net in the design to which connections are to be added | | `-inst_pattern` | Optional specifies a regular expression to select a set of instances from the design. (Default: .\*) | | `-pin_pattern` | Species a regular expression to select pins on the selected instances to connect to the specified net | | `-power` | Specifies that the net it a power net | | `-ground` | Specifies that the net is a ground net | | `-region` | Specifies the name of the region for this rule | ##### Examples ```default # Stdcell power/ground pins add_global_connection -net VDD -pin_pattern {^VDD$} -power add_global_connection -net VSS -pin_pattern {^VSS$} -ground # SRAM power ground pins add_global_connection -net VDD -pin_pattern {^VDDPE$} add_global_connection -net VDD -pin_pattern {^VDDCE$} add_global_connection -net VSS -pin_pattern {^VSSE$} ``` #### Perform global connections The `global_connect` command is used to connect power and ground pins on design instances to the appropriate supplies. ```default global_connect [-force] [-verbose] ``` ##### Options | Switch Name | Description | |---------------|----------------------------------------------------------------------| | `-force` | If specified, global connections will overwrite existing connections | | `-verbose` | If specified, report the number of connections made and skipped. | #### Clear global connection rules The `clear_global_connect` command is used remove all defined global connection rules. ```default clear_global_connect ``` #### Report global connection rules The `report_global_connect` command is used print out the currently defined global connection rules. ```default report_global_connect ``` #### Report cell type usage The `report_cell_usage` command is used to print out the usage of cells for each type of cell. ```default report_cell_usage [-verbose] [module instance] [-file file] [-stage stage] ``` ##### Options | Switch Name | Description | |-------------------|---------------------------------------------------------| | `-verbose` | Add information about all leaf instances. | | `module instance` | Report cell usage for a specified module instance. | | `-file file` | Create cell usage snapshot with the given path to file. | | `-stage stage` | Attach the stage to the snapshot. | #### Report Timing Histogram The `report_timing_histogram` command reports a visualization of the slack distribution in the design. ```tcl report_timing_histogram [-num_bins num_bins] [-bin_size bin_size] [-setup|-hold] ``` ##### Options | Switch Name | Description | |---------------|---------------------------------------------------------------------------------------------------------------------------------------------------------| | `-num_bins` | Number of histogram bins to display (default is 10). Mutually exclusive with `-bin_size`. | | `-bin_size` | Fixed bin size for histogram. Bins are aligned to multiples of bin_size in the user time unit (e.g., nanoseconds). Mutually exclusive with `-num_bins`. | | `-setup` | Use setup paths (this is the default). | | `-hold` | Use hold paths. | #### Report Logic Depth Histogram The `report_logic_depth_histogram` command reports a visualization of the logic depth for all constrained endpoints. That is to say, bin the one logic depth length for the most timing constrained path for each endpoint. This is not necessarily the deepest path for the endpoint. ```tcl report_logic_depth_histogram [-num_bins num_bins] [-exclude_buffers] [-exclude_inverters] ``` ##### Options | Switch Name | Description | |----------------------|-------------------------------------------------------| | `-num_bins` | Number of histogram bins to display (default is 10). | | `-exclude_buffers` | Exclude buffers when counting critical path length. | | `-exclude_inverters` | Exclude inverters when counting critical path length. | #### 3D Blox The `read_3dblox_bmap` command will read the bump map and place the bumps into the current design. ```tcl read_3dblox_bmap filename ``` ##### Options | Switch Name | Description | |---------------|-----------------------| | `filename` | Path to the bump map. | ## TCL functions Get the die and core areas as a list in microns: `llx lly urx ury` ```default ord::get_die_area ord::get_core_area ``` The `place_inst` command is used to place an instance. If -cell is given then a new instance may be created as well as placed. ```default place_inst -name inst_name \ (-origin xy_origin | -location xy_location) \ [-orientation orientation] \ [-cell library_cell] \ [-status status] ``` ### Options | Switch Name | Description | |---------------|-------------------------------------------------------------------------| | `-name` | The name of the instance | | `-orientaton` | The orientation of the instance. Default is R0 | | `-origin` | The x and y coordinates for where the origin of the instance is placed. | | `-location` | The x and y coordinates for where the instance is placed. | | `-cell` | Required if a new instance is to be created. | | `-status` | The placement status of the instance. Default is PLACED | ## FAQs Check out [GitHub discussion](https://github.com/The-OpenROAD-Project/OpenROAD/discussions/categories/q-a?discussions_q=category%3AQ%26A+openroad+in%3Atitle) about this tool. ## License BSD 3-Clause License. # README.html.md # Hierarchical Macro Placement A hierarchical automatic macro placer for large-scale complex IP blocks, “Hier-RTLMP”. This tool builds on the existing RTLMP (`mpl`) framework, adopting a multilevel physical planning approach that exploits the hierarchy and data flow inherent in the design RTL. ## Commands #### NOTE - Parameters in square brackets `[-param param]` are optional. - Parameters without square brackets `-param2 param2` are required. ### RTL Macro Placer This command executes the Hier-RTLMP algorithm for macro placement. ```tcl rtl_macro_placer [-max_num_macro max_num_macro] [-min_num_macro min_num_macro] [-max_num_macro max_num_macro] [-max_num_inst max_num_inst] [-min_num_inst min_num_inst] [-tolerance tolerance] [-max_num_level max_num_level] [-coarsening_ratio coarsening_ratio] [-large_net_threshold large_net_threshold] [-halo_width halo_width] [-halo_height halo_height] [-fence_lx fence_lx] [-fence_ly fence_ly] [-fence_ux fence_ux] [-fence_uy fence_uy] [-area_weight area_weight] [-outline_weight outline_weight] [-wirelength_weight wirelength_weight] [-guidance_weight guidance_weight] [-fence_weight fence_weight] [-boundary_weight boundary_weight] [-notch_weight notch_weight] [-soft_blockage_weight soft_blockage_weight] [-target_util target_util] [-min_ar min_ar] [-report_directory report_directory] [-write_macro_placement file_name] [-keep_clustering_data] ``` #### Options | Switch Name | Description | |----------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-max_num_macro`, `-min_num_macro` | Maximum/minimum number of macros in a cluster. The default value is `0` for both, and the allowed values are integers `[0, MAX_INT]`. | | `-max_num_inst`, `-min_num_inst` | Maximum/minimum number of standard cells in a cluster. The default value is `0` for both, and the allowed values are integers `[0, MAX_INT]`. | | `-tolerance` | Add a margin to the minimum and maximum number of macros/std cells in a cluster. For min, we multiply by (1 - `tol`), and for the max (1 + `tol`). This is to improve the robustness of hierarchical clustering. The allowed values are floats `[0, 1)`, and the default value is `0.1`. | | `-max_num_level` | Maximum depth of physical hierarchical tree. The default value is `2`, and the allowed values are integers `[0, MAX_INT]`. | | `-coarsening_ratio` | The larger the coarsening_ratio, the faster the convergence process. The allowed values are floats, and the default value is `10.0`. | | `-large_net_threshold` | Ignore nets with many connections during clustering, such as global nets. The default value is `50`, and the allowed values are integers `[0, MAX_INT]`. | | `-halo_width` | **Deprecated: use `set_macro_base_halo` instead.** Horizontal halo around macros (microns). The default value is `0.0`. | | `-halo_height` | **Deprecated: use `set_macro_base_halo` instead.** Vertical halo around macros (microns). The default value is `0.0`. | | `-fence_lx`, `-fence_ly`, `-fence_ux`, `-fence_uy` | Defines the global fence bounding box coordinates. The default values are the core area coordinates). | | `-target_util` | Specifies the target utilization. The allowed values are floats and the default value is `0.25`. | | `-min_ar` | Specifies the minimum aspect ratio $a$, or the ratio of its width to height of a `StandardCellCluster` from $[a, \frac{1}{a}]$. The allowed values are floats, and the default value is `0.33`. | | `-report_directory` | Save reports to this directory. | | `-write_macro_placement` | Generates a file with the design’s macro placement in the format of calls for the `place_macro` command. | | `-keep_clustering_data` | Save the hierarchy generated by MPL’s clustering engine in the form of dbGroups inside ODB. | #### Simulated Annealing Weight parameters Do note that while action probabilities are normalized to 1.0, the weights are not necessarily normalized. | Switch Name | Description | |-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-area_weight` | Weight for the area of current floorplan. The allowed values are floats, and the default value is `0.1`. | | `-outline_weight` | Weight for violating the fixed outline constraint, meaning that all clusters should be placed within the shape of their parent cluster. The allowed values are floats, and the default value is `100.0`. | | `-wirelength_weight` | Weight for half-perimeter wirelength. The allowed values are floats, and the default value is `100.0`. | | `-guidance_weight` | Weight for guidance cost or clusters being placed near specified regions if users provide such constraints. The allowed values are floats, and the default value is `10.0`. | | `-fence_weight` | Weight for fence cost, or how far the macro is from zero fence violation. The allowed values are floats, and the default value is `10.0`. | | `-boundary_weight` | Weight for the boundary, or how far the hard macro clusters are from boundaries. Note that mixed macro clusters are not pushed, thus not considered in this cost. The allowed values are floats, and the default value is `50.0`. | | `-notch_weight` | Weight for the notch, or the existence of dead space that cannot be used for placement & routing. Note that this cost applies only to hard macro clusters. The allowed values are floats, and the default value is `10.0`. | | `-soft_blockage_weight` | Weight for the penalty based on overlap between clusters with macros and areas of virtual blockages generated by the macro placer. The idea is to prevent macros from occupying certain areas: currently we may generate these blockages to protect the surroundings of areas reserved for IO pins. The allowed values are floats, and the default value is `10.0`. | ### Place Macro Command for manual placement of a single macro. ```tcl place_macro -macro_name macro_name -location {x y} [-orientation orientation] [-exact] [-allow_overlap] ``` #### Options | Switch Name | Description | |------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-macro_name` | The name of a macro of the design. | | `-location` | The lower left corner of the macro in microns. | | `-orientation` | The orientation according to odb. If nothing is specified, defaults to `R0`. We only allow `R0`, `MY`, `MX` and `R180`. | | `-exact` | Enforce the exact `-location`. Note that the default behavior of `place_macro` is to snap the macro, that is, tune the entered `-location` so that the signal pins get aligned with the track-grid. | | `-allow_overlap` | Allow the macro to be placed even if it overlaps with other macros. Note that the default behavior is to only place the macro if no overlap with other macros is found. | ### Set Macro Guidance Region Command for setting guidance regions for macros. The guidance region can have any size as long it fits inside the core area, as the placer will try to maximize the overlap region between macro and guidance region. ```tcl set_macro_guidance_region -macro_name macro_name -region region ``` #### Options | Switch Name | Description | |---------------|--------------------------------------------------------------------------------------| | `-macro_name` | The name of a macro of the design. | | `-region` | The lower left corner and upper right corner {lx ly ux uy} of the region in microns. | ### Set Macro Base Halo Command for setting the base halo around all macros. Per-macro halos set with `set_macro_halo` take precedence. ```tcl set_macro_base_halo left bottom right top set_macro_base_halo width height ``` #### Arguments The left, bottom, right and top halo, or the width (sets both left and right) and height (sets both bottom and top), in microns. ### Set Macro Halo Command for setting a halo for specific macros. If unset, the macro will use the default halo. ```tcl set_macro_halo -macro_name macro_name -halo {left bottom right top | width height} ``` #### Options | Switch Name | Description | |---------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-macro_name` | The name of a macro of the design. | | `-halo` | The left, bottom, right and top halo or the width (sets both left and right) and height (sets both bottom and top), in microns. Consider the macro orientation as R0 when setting the halo. | ### Block Macro Channels Creates soft placement blockages around all fixed macros in the design, based on their halos. Macros with soft DEF halos are skipped, as other placement-aware tools already honor them. For each macro, the halo used is resolved by this priority: 1. The per-macro halo set with `set_macro_halo`, if defined. 2. The DEF halo, floored by the base halo set with `set_macro_base_halo`. 3. The base halo. ```tcl block_macro_channels ``` ## Example scripts Example of a script demonstrating how to run `mpl` on a sample design of `bp_fe_top` as follows: ```shell ./test/bp_fe_top.tcl ``` ## Regression tests There are a set of regression tests in `./test`. For more information, refer to this [section](../../README.md#regression-tests). Simply run the following script: ```shell ./test/regression ``` ## Limitations ## References 1. A. B. Kahng, R. Varadarajan and Z. Wang, “RTL-MP: Toward Practical, Human-Quality Chip Planning and Macro Placement”, [(.pdf)](https://vlsicad.ucsd.edu/Publications/Conferences/389/c389.pdf), Proc. ACM/IEEE Intl. Symp. on Physical Design, 2022, pp. 3-11. 2. A. B. Kahng, R. Varadarajan and Z. Wang, “Hier-RTLMP: A hierarchical automatic macro placer for large-scale complex IP blocks.”, [(.pdf)](https://arxiv.org/pdf/2304.11761.pdf), arXiv preprint arXiv:2304.11761, 2023. ## FAQs Check out [GitHub discussion](https://github.com/The-OpenROAD-Project/OpenROAD/discussions/categories/q-a?discussions_q=category%3AQ%26A+hier-rtlmp+OR+hier+OR+mpl) about this tool. ## License BSD 3-Clause License. See [LICENSE](../../LICENSE) file. # README.html.md # RAM Generator ⚠️ **This is an experimental module currently under development. See [#9392](https://github.com/The-OpenROAD-Project/OpenROAD/issues/9392).** ⚠️ The Random Access Memory generator module in OpenROAD (`ram`) is inspired by the [DFFRAM](https://github.com/AUCOHL/DFFRAM) project from AUCOHL. This module is designed to create dense memory arrays from standard cells when other memory compilers are not available. Given a standard cell library with the required basic cells, the generator can produce a placed and routed RAM block. The generated ram can be checked using the built-in static timing analyzer rather than SPICE simulation, leading to faster turnaround time. **Major Features**: - Support for 1rw memories - Arbitrary word size and number of words (although timing must be checked) - Arbitrary word mask granularity - Generated behavioral Verilog model for fast, portable simulation **Tested Platforms**: - sky130hd **Planned Features**: - See [#9392](https://github.com/The-OpenROAD-Project/OpenROAD/issues/9392) ## Commands #### NOTE - Parameters in square brackets `[-param param]` are optional. - Parameters without square brackets `-param2 param2` are required. ### RAM Generation The `generate_ram` command is an all-in-one command to place and route a RAM. Standard cell libraries must be loaded before running this command. The module will create a new design, therefore a design should not be loaded before running the command. ```tcl generate_ram [-mask_size bits] -word_size bits -num_words words [-column_mux_ratio ratio] [-read_ports count] [-storage_cell name] [-tristate_cell name] [-inv_cell name] -power_pin name -ground_pin name [-power_net_name name] [-ground_net_name name] -routing_layer config -ver_layer config -hor_layer config -filler_cells fillers [-tapcell name] [-max_tap_dist value] [-write_behavioral_verilog filename] ``` #### Options | Switch Name | Description | |-----------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-mask_size` | Determines the number of bits which are grouped together for masking during writes. For example, a mask size of `8` will enable each 8 bits of the word to be masked when writing (commonly known as byte masking). A mask size of `1` will enable each bit to be individually masked. The write enable signal for each port will be `(word_size / mask_size)` bits wide. The word size must be a multiple of the mask size. Default: equal to `-word_size`. | | `-word_size` | Size of each word in bits. | | `-num_words` | Number of words in the array. | | `-column_mux_ratio` | Number of words sharing a physical column. Must be `1`, `2`, or `4`. The number of words must be divisible by the column mux ratio. Default: `1` (no column muxing). | | `-read_ports` | Number of read ports for the array. Default: 1. | | `-storage_cell` | Name of the master to use for the storage device (i.e. a flip-flop). Must be positive-edge triggered. Default: auto-select from the loaded cell library. | | `-tristate_cell` | Name of the master to use for the tristate device (i.e. a tristate inverter). It is currently assumed that the device is inverting. Default: auto-select from the loaded cell library. | | `-inv_cell` | Name of the master to use for inverters. Default: auto-select from the loaded cell library. | | `-power_pin` | Name of the power pin in each standard cell used. Only one name is currently supported. | | `-ground_pin` | Name of the ground pin in each standard cell used. Only one name is currently supported. | | `-routing_layer` | A list of the metal layer and metal width (in microns) for generating standard cell power tracks (followpins). Example: `{met1 0.48}`. | | `-power_net_name` | Name of the power net to create. Default: `VDD`. | | `-ground_net_name` | Name of the ground net to create. Default: `VSS`. | | `-ver_layer` | A list of the metal layer, metal width (in microns), and metal pitch (in microns) for generating power grid stripes on the first vertical layer above the followpin layer. Example: `{met2 0.48 40}`. North/South I/O pins are also created in this layer. | | `-hor_layer` | A list of the metal layer, metal width (in microns), and metal pitch (in microns) for generating power grid stripes on the first horizontal layer above the followpin layer. Example: `{met3 0.48 40}`. East/West I/O pins are also created in this layer. | | `-filler_cells` | A list of filler cells to use. Example: `{FILL_X1 FILL_X2 FILL_X4}`. | | `-tapcell` | The name of the tapcell master to insert into the grid to obey latchup requirements. Requires `-max_tap_dist`. If this argument is not provided, no tapcells will be inserted. | | `-max_tap_dist` | The distance (in microns) that tapcells should be placed apart. Requires `-tapcell`. | | `-use_latch` | If set to `1`, uses a two-phase latch-based design instead of flip-flops for the storage elements. Functionally equivalent to flip-flop design with smaller storage cell area. Default: `0`. | | `-write_behavioral_verilog` | Write a behavioral Verilog model of the RAM array to the specified file. | ## Example scripts See [test/make_8x8.tcl](). ## Regression tests There are a set of regression tests in `./test`. Refer to this [section](../../README.md#regression-tests) for more information. Simply run the following script: ```shell ./test/regression ``` ## Limitations This is an experimental module and many basic features may not work yet. Please see [#9392](https://github.com/The-OpenROAD-Project/OpenROAD/issues/9392) for ongoing and future work. ## FAQs Check out [GitHub discussion](https://github.com/The-OpenROAD-Project/OpenROAD/discussions/categories/q-a?discussions_q=category%3AQ%26A+ram+in%3Atitle) about this tool. ## Authors - Matt Liberty ([@maliberty](https://github.com/maliberty)) - Brayden Louie ([@braydenlouie](https://github.com/braydenlouie)) and Thinh Nguyen ([@tnguy19](https://github.com/tnguy19/)), advised by Austin Rovinski ([@rovinski](https://github.com/rovinski/)) ## References Inspired by the [DFFRAM](https://github.com/AUCOHL/DFFRAM) project from AUCOHL. ## License BSD 3-Clause License. See [LICENSE](../../LICENSE) file. # README.html.md # Parallax Static Timing Analyzer OpenSTA is a gate level static timing verifier. As a stand-alone executable it can be used to verify the timing of a design using standard file formats. * Verilog netlist * Liberty library * SDC timing constraints * SDF delay annotation * SPEF parasitics * VCD power acitivies * SAIF power acitivies OpenSTA uses a TCL command interpreter to read the design, specify timing constraints and print timing reports. ## Clocks * Generated * Latency * Source latency (insertion delay) * Uncertainty * Propagated/Ideal * Gated clock checks * Multiple frequency clocks ## Exception paths * False path * Multicycle path * Min/Max path delay * Exception points * -from clock/pin/instance -through pin/net -to clock/pin/instance * Edge specific exception points * -rise_from/-fall_from, -rise_through/-fall_through, -rise_to/-fall_to ## Delay calculation * Integrated Dartu/Menezes/Pileggi RC effective capacitance algorithm * External delay calculator API ## Analysis * Report timing checks -from, -through, -to, multiple paths to endpoint * Report delay calculation * Check timing setup ## Timing Engine OpenSTA is architected to be easily bolted on to other tools as a timing engine. By using a network adapter, OpenSTA can access the host netlist data structures without duplicating them. * Query based incremental update of delays, arrival and required times * Simulator to propagate constants from constraints and netlist tie high/low See doc/OpenSTA.pdf for command documentation. See doc/ChangeLog.txt for changes to commands. See doc/StaApi.txt for timing engine API documentation. OpenSTA is dual licensed. It is released under GPL v3 as OpenSTA and is also licensed for commerical applications by Parallax Software without the GPL’s requirements. OpenSTA is open source, meaning the sources are published and can be compiled locally. Derivative works are supported as long as they adhere to the GPL license requirements. However, OpenSTA is not supported by a public community of developers as many other open source projects are. The copyright and development are exclusive to Parallax Software. Removing copyright and license notices from OpenSTA sources (or any other open source project for that matter) is illegal. This should be obvious, but the author of OpenSTA has discovered two different cases where the copyright and license were removed from source files that were copied. The official git repository is located at https://github.com/parallaxsw/OpenSTA.git. Any forks from this code base have not passed extensive regression testing which is not publicly available. ## Build from source OpenSTA is built with CMake. ### Prerequisites The build dependency versions are shown below. Other versions may work, but these are the versions used for development. ```default Ubuntu Macos 22.04.2 14.5 cmake 3.24.2 3.29.2 clang 15.0.0 gcc 11.4.0 tcl 8.6 8.6.16 swig 4.1.0 4.1.1 bison 3.8.2 3.8.2 flex 2.6.4 2.6.4 ``` External library dependencies: ```default Ubuntu Darwin License eigen 3.4.0 3.4.0 MPL2 required cudd 3.0.0 3.0.0 BSD required tclreadline 2.3.8 2.3.8 BSD optional zLib 1.2.5 1.2.8 zlib optional libfmt 8.1.1 N/A MIT required if std::format not available ``` The [TCL readline library](https://tclreadline.sourceforge.net/tclreadline.html) links the GNU readline library to the TCL interpreter for command line editing To enable TCL readline support use the following Cmake option: See (https://tclreadline.sourceforge.net/) for TCL readline documentation. To change the overly verbose default prompt, add something this to your ~/.sta init file: ```default if { ![catch {package require tclreadline}] } { proc tclreadline::prompt1 {} { return "> " } } ``` The Zlib library is an optional. If CMake finds libz, OpenSTA can read Liberty, Verilog, SDF, SPF, and SPEF files compressed with gzip. [CUDD](https://github.com/cuddorg/cudd) is a binary decision diagram (BDD) package that is used to improve conditional timing arc handling, constant propagation, power activity propagation and spice netlist generation. Download and build CUDD: ```default git clone https://github.com/cuddorg/cudd.git cd cudd git checkout 3.0.0 ./configure make ``` You can use the “configure –prefix” option and “make install” to install CUDD in a different directory. Modern c++ compilers that support c++20 include support for std::format. With older compilers like gcc 11 on Ubuntu 22.04 and Centos7 the fmt library is used instead. If it is not installed locally, the github repository is downloaded and compiled in the build directory. ### Building with CMake Use the following commands to checkout the git repository and build the OpenSTA library and excutable. ```default git clone https://github.com/parallaxsw/OpenSTA.git cd OpenSTA mkdir build cd build cmake -DCUDD_DIR= .. make ``` The default build type is release to compile optimized code. The resulting executable is in `build/sta`. The library without a `main()` procedure is `build/libOpenSTA.a`. Optional CMake variables passed as -D= arguments to CMake are show below. ```default CMAKE_BUILD_TYPE DEBUG|RELEASE CMAKE_CXX_FLAGS - additional compiler flags TCL_LIBRARY - path to tcl library TCL_HEADER - path to tcl.h CUDD_DIR - path to cudd installation ZLIB_ROOT - path to zlib CMAKE_INSTALL_PREFIX ``` If `TCL_LIBRARY` is specified the CMake script will attempt to locate the header from the library path. The default install directory is `/usr/local`. To install in a different directory with CMake use the CMAKE_INSTALL_PREFIX option. If you make changes to `CMakeLists.txt` you may need to clean out existing CMake cached variable values by deleting all of the files in the build directory. ## Build with Docker AN alternative way to build and run OpenSTA is with [Docker](https://www.docker.com). After installing Docker, the following command builds a Docker image. ```default cd OpenSTA docker build --file Dockerfile.ubuntu22.04 --tag opensta_ubuntu22.04 . or docker build --file Dockerfile.centos7 --tag opensta_centos7 . ``` The centos7 build on mac/OsX with ARM processorts requires the platform to be specified. ```default docker build --file Dockerfile.centos7 --platform=linux/amd64 --tag opensta_centos7 . ``` To run a docker container using the OpenSTA image, use the -v option to docker to mount direcories with data to use and -i to run interactively. ```default docker run -i -v $HOME:/data opensta ``` ## Build on Macos/Darwin The XCode versions of Tcl, Flex and Bison cannot be used to build OpenSTA. Use Homebrew to install them. The following command installs the tools required to build OpenSTA in the Brewfile. ```default brew bundle install ``` Set these variables before using cmake to cirumvent the Xcode versions. ```default # flex/bison override apple version export PATH="$(brew --prefix bison)/bin:${PATH}" export PATH="$(brew --prefix flex)/bin:${PATH}" export CMAKE_INCLUDE_PATH="$(brew --prefix flex)/include" export CMAKE_LIBRARY_PATH="$(brew --prefix flex)/lib;$(brew --prefix bison)/lib" ``` Homebrew does not support tclreadline, but the macports system does (see https://www.macports.org). ## Install using a package manager ### Guix OpenSTA is available in the [default repositories](https://hpc.guix.info/package/opensta): ```default guix install opensta ``` ## Bug Reports Use the Issues tab on the github repository to report bugs. Each issue/bug should be a separate issue. The subject of the issue should be a short description of the problem. Attach a test case to reproduce the issue as described below. Issues without test cases are unlikely to get a response. The test case should have a tcl command file recreates the issue named run.tcl. If is are more than one command file using the same data files, there should be separate command files, run1.tcl, run2.tcl etc. The bug report can refer to these command files by name. Command files should not have absolute filenames like “/home/john/OpenSTA_bug/write_path_spice/dump_spice” in them. These obviously are not portable. Use filenames relative to the test case directory. The files in the test case should be collected into a directory. The contents of the directory should be collected into a compressed tarfile. ## Contributions Contributors must sign the Contributor License Agreement (doc/CLA.txt) when submitting pull requests. All contributors should read doc/CodingGuidelines.txt for notes on making code that adheres to the existing naming and formatting style. Contributions that claim 4% performance improvements in OpenROAD flow scripts will largely be ignored. Small performance improvements simply do not justify the time required to audit and verify the changes. Contributions that add dependencies on external libraries like boost, abseil and Intel TBB will not be accepted. As the author of OpenSTA I vastly prefer writing code to reviewing code. I don’t have the patience to go round after round to correct code formatting that is not consistent with the rest of the code. ## Authors * James Cherry * William Scott authored the arnoldi delay calculator at Blaze, Inc which was subsequently licensed to Nefelus, Inc that has graciously contributed it to OpenSTA. ## License OpenSTA, Static Timing Analyzer Copyright © 2023, Parallax Software, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see [https://www.gnu.org/licenses/](https://www.gnu.org/licenses/). # README.html.md # Restructure The restructure module in OpenROAD (`rmp`) is based on an interface to ABC for local resynthesis. The package allows logic restructuring that targets area or timing. It extracts a cloud of logic to ABC using the [`cut`](../cut/README.md) module. Multiple recipes for area or timing are run to obtain multiple structures from ABC; the most desirable among these is used to improve the netlist. The resynthesized logic is then read back to OpenDB. Reading back of constants requires insertion of tie cells which should be provided by the user as per the interface described below. ## Commands #### NOTE - Parameters in square brackets `[-param param]` are optional. - Parameters without square brackets `-param2 param2` are required. ### Restructure Restructuring can be done in two modes: area or delay. - Method 1: Area Mode Example: `restructure -liberty_file ckt.lib -target area -tielo_pin ABC -tiehi_pin DEF` - Method 2: Timing Mode Example: `restructure -liberty_file ckt.lib -target delay -tielo_pin ABC -tiehi_pin DEF -slack_threshold 1 -depth_threshold 2` ```tcl restructure [-slack_threshold slack_val] [-depth_threshold depth_threshold] [-target area|delay] [-abc_logfile logfile] [-liberty_file liberty_file] [-tielo_port tielo_pin_name] [-tiehi_port tiehi_pin_name] [-work_dir work_dir] ``` #### Options | Switch Name | Description | |--------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-liberty_file` | Liberty file with description of cells used in design. This is passed to ABC. | | `-target` | Either `area` or `delay`. In area mode, the focus is area reduction, and timing may degrade. In delay mode, delay is likely reduced, but the area may increase. The default value is `area`. | | `-slack_threshold` | Specifies a (setup) timing slack value below which timing paths need to be analyzed for restructuring. The default value is `0`, and the allowed values are floats `[0, MAX_FLOAT]`. | | `-depth_threshold` | Specifies the path depth above which a timing path would be considered for restructuring. The default value is `16`, and the allowed values are `[0, MAX_INT]`. | | `-tielo_pin` | Tie cell pin that can drive constant zero. The format is `/`. | | `-tiehi_pin` | Tie cell pin that can drive constant one. The format is `/`. | | `-abc_logfile` | Output file to save abc logs to. | | `-work_dir` | Name of the working directory for temporary files. If not provided, `run` directory would be used. | ### Resynth Resynthesize parts of the design in an attempt to fix negative slack. ```tcl resynth [-corner corner] ``` #### Options | Switch Name | Description | |---------------|------------------------| | `-corner` | Process corner to use. | ### Resynth with simulated annealing Resynthesize parts of the design with an ABC script found via simulated annealing. The script is a series of operations on ABC’s internal AIG data structure. A neighboring solution is a script with one operation added, removed, or two operations swapped. The optimization function is defined as the worst slack. ```tcl resynth_annealing [-corner corner] [-slack_threshold slack_threshold] [-seed seed] [-temp temp] [-iters iters] [-revert_after revert_after] [-initial_ops initial_ops] ``` #### Options | Switch Name | Description | |--------------------|----------------------------------------------------------------------------------------------------------------------------------| | `-corner` | Process corner to use. | | `-slack_threshold` | Specifies a (setup) timing slack value below which timing paths need to be analyzed for restructuring. The default value is `0`. | | `-seed` | Seed to use for randomness in simulated annealing. | | `-temp` | Initial temperature for simulated annealing. The default is the required arrival time on the worst slack endpoint. | | `-iters` | Number of iterations to run simulated annealing for. | | `-revert_after` | After the given number of iterations that worsen slack, revert to best found solution. | | `-initial_ops` | Size of the initial random solution (number of commands in the script for ABC). | ### Resynth with genetic slack tuning Resynthesize parts of the design with an ABC script found via genetic algorithm. An individual in a population is a series of operations on ABC’s internal AIG data structure. Each such operation is considered a gene. Genotype can be changed by a mutation with operations such as adding, removing or swapping genes with a `mutation_probability` probability. Individual can also be changed by crossing two genes together with a `crossover_probability` probability. The optimization function is defined as the worst slack. ```tcl resynth_genetic [-corner corner] [-slack_threshold slack_threshold] [-seed seed] [-population_size population_size] [-mutation_probability mutation_probability] [-crossover_probability crossover_probability] [-tournament_probability tournament_probability] [-tournament_size tournament_size] [-iters iters] [-initial_ops initial_ops] ``` #### Options | Switch Name | Description | |---------------------------|----------------------------------------------------------------------------------------------------------------------------------| | `-corner` | Process corner to use. | | `-slack_threshold` | Specifies a (setup) timing slack value below which timing paths need to be analyzed for restructuring. The default value is `0`. | | `-seed` | Seed to use for randomness. | | `-population_size` | Population size. | | `-mutation_probability` | Probability of applying mutation operator. | | `-crossover_probability` | Probability of applying crossover operator. | | `-tournament_probability` | Tournament probability. | | `-tournament_size` | Tournament size. | | `-iters` | Number of iterations to run genetic algorithm. | | `-initial_ops` | Size of the initial random solution (number of commands in the script for ABC). | ## Example scripts Example scripts on running `rmp` for a sample design of `gcd` as follows: ```default ./test/gcd_restructure.tcl ``` ## Regression tests There are a set of regression tests in `./test`. For more information, refer to this [section](../../README.md#regression-tests). Simply run the following script: ```shell ./test/regression ``` ## Limitations ## FAQs Check out [GitHub discussion](https://github.com/The-OpenROAD-Project/OpenROAD/discussions/categories/q-a?discussions_q=category%3AQ%26A+restructure) about this tool. ## Authors - Sanjiv Mathur - Ahmad El Rouby ## License BSD 3-Clause License. See [LICENSE](../../LICENSE) file. # README.html.md # Power Distribution Network Generator The power distribution network (PDN) generator module in OpenROAD (`pdn`) is based on the PDNGEN tool. This utility aims to simplify the process of adding a power grid into a floorplan. The aim is to specify a small set of power grid policies to be applied to the design, such as layers to use, stripe width and spacing, then have the utility generate the actual metal straps. Grid policies can be defined over the stdcell area, and over areas occupied by macros. ## Commands #### NOTE - Parameters in square brackets `[-param param]` are optional. - Parameters without square brackets `-param2 param2` are required. ### Build Power Grid Build a power grid in accordance with the information specified. ```tcl pdngen [-check_only] [-dont_add_pins] [-failed_via_report file] [-report_only] [-reset] [-ripup] [-skip_trim] ``` #### Options | Switch Name | Description | |------------------------|------------------------------------------------------------------------------------------------------------------------------------------| | `[-dont_add_pins]` | Prevent the creation of block pins. | | `[-failed_via_report]` | Generate a report file which can be viewed in the DRC viewer for all the failed vias (ie. those that did not get built or were removed). | | `[-report_only]` | Print the current specifications. | | `[-check_only]` | Check the current setup for errors. | | `[-reset]` | Reset the grid and domain specifications. | | `[-ripup]` | Ripup the existing power grid, as specified by the voltage domains. | | `[-skip_trim]` | Skip the metal trim step, which attempts to remove metal stubs. | ### Define Voltage Domain Defines a named voltage domain with the names of the power and ground nets for a region. This region must already exist in the floorplan before referencing it with the `set_voltage_domain` command. If the `-region` argument is not supplied then region is the entire core area of the design. Example usage: ```default set_voltage_domain -power VDD -ground VSS set_voltage_domain -name TEMP_ANALOG -region TEMP_ANALOG -power VIN -ground VSS set_voltage_domain -region test_domain -power VDD -ground VSS -secondary_power VREG ``` ```tcl set_voltage_domain -ground ground_net_name -name domain_name -power power_net_name [-region region_name] [-secondary_power secondary_power_net] [-switched_power switched_power_net] [-connect_to_pad_layers layers] [-connect_to_pads] ``` #### Options | Switch Name | Description | |----------------------------|-------------------------------------------------------------------------------------------| | `-ground` | Specifies the name of the ground net for this voltage domain. | | `-name` | Defines the name of the voltage domain. The default is “Core” or region name if provided. | | `-power` | Specifies the name of the power net for this voltage domain. | | `[-region]` | Specifies a region of the design occupied by this voltage domain. | | `[-secondary_power]` | Specifies the name of the secondary power net for this voltage domain. | | `[-switched_power]` | Specifies the name of the switched power net for switched power domains. | | `[-connect_to_pad_layers]` | Restrict the pad pins layers to this list. | | `[-connect_to_pads]` | The core side of the pad pins will be connected to the grid. | ### Define Power Grids #### WARNING `define_pdn_grid` is overloaded with two different signatures. Take note of the arguments when using this function! - Method 1: General Usage Define the rules to describe a power grid pattern to be placed in the design. Example usage: ```default define_pdn_grid -name main_grid -pins {metal7} -voltage_domain {CORE TEMP_ANALOG} ``` - Method 2: Macros Define the rules for one or more macros. Example usage: ```default define_pdn_grid -macro -name ram -orient {R0 R180 MX MY} -grid_over_pg_pins -starts_with POWER define_pdn_grid -macro -name rotated_rams -orient {E FE W FW} -grid_over_boundary -starts_with POWER ``` - Method 3: Modify existing power domain Modify pre-existing power domain. Example usage: ```default define_pdn_grid -name main_grid -existing ``` ```tcl define_pdn_grid [-cells list_of_cells] [-default] [-existing] [-grid_over_pg_pins|-grid_over_boundary] [-halo list_of_halo_values] [-instances list_of_instances] [-macro] [-name name] [-obstructions list_of_layers] [-orient list_of_valid_orientations] [-pins list_of_pin_layers] [-power_control signal_name] [-power_control_network STAR|DAISY] [-power_switch_cell name] [-starts_with POWER|GROUND] [-voltage_domains list_of_domain_names] ``` #### Options | Switch Name | Description | |-------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `[-cells]` | For a macro, defines a set of valid cells. Macros which are instances of one of these cells will use this grid specification. | | `[-default]` | For a macro, specifies this is a default grid that can be overwritten. | | `[-existing]` | Flag to enable defining for existing routing solution. | | `[-grid_over_pg_pins]`, `[-grid_over_boundary]` | Place the power grid over the power ground pins of the macro. (Default True), or Place the power grid over the entire macro. | | `[-halo]` | Specifies the default minimum separation of selected macros from other cells in the design. This is only used if the macro does not define hard halo values in the LEF description. If 1 value is specified it will be used on all 4 sides, if two values are specified, the first will be applied to left/right sides and the second will be applied to top/bottom sides, if 4 values are specified, then they are applied to left, bottom, right and top sides respectively (Default: 0). | | `[-instances]` | For a macro, defines a set of valid instances. Macros with a matching instance name will use this grid specification. | | `[-macro]` | Defines the type of grid being added as a macro. | | `[-name]` | Defines a name to use when referring to this grid definition. | | `[-obstructions]` | Specify the layers to add routing blockages, in order to avoid DRC violations. | | `[-orient]` | For a macro, defines a set of valid orientations. LEF orientations (N, FN, S, FS, E, FE, W and FW) can be used as well as standard geometry orientations (R0, R90, R180, R270, MX, MY, MXR90 and MYR90). Macros with one of the valid orientations will use this grid specification. | | `[-pins]` | Defines a list of layers which where the power straps will be promoted to block pins. | | `[-power_control]` | Defines the name of the power control signal used to control the switching of the inserted power switches. | | `[-power_control_network]` | Defines the structure of the power control signal network. Choose from STAR, or DAISY. If STAR is specified, then the network is wired as a high-fanout net with the power control signal driving the power control pin on every power switch. If DAISY is specified then the power switches are connected in a daisy-chain configuration - note, this requires that the power swich defined by the `define_power_switch_cell` command defines an acknowledge pin for the switch. | | `[-power_switch_cell]` | Defines the name of the coarse grain power switch cell to be used wherever the stdcell rail connects to the rest of the power grid. The mesh layers are associated with the unswitched power net of the voltage domain, whereas the stdcell rail is associated with the switched power net of the voltage domain. The placement of a power switch cell connects the unswitched power mesh to the switched power rail through a power switch defined by the `define_power_switch_cell` command. | | `[-starts_with]` | Specifies whether the first strap placed will be POWER or GROUND (Default: GROUND). | | `[-voltage_domains]` | Defines the name of the voltage domain for this grid (Default: Last domain created). | ### Power Switch Cell insertion Define a power switch cell that will be inserted into a power grid Example usage: ```default define_power_switch_cell -name POWER_SWITCH -control SLEEP -power_switchable VDD -power VDDG -ground VSS ``` ```tcl define_power_switch_cell -control control_pin -ground ground_pin -name name -power unswitched_power_pin -power_switchable power_switchable_pin [-acknowledge acknowledge_pin_name] ``` #### Options | Switch Name | Description | |---------------------|------------------------------------------------------------------------------------------| | `-control` | The name of the power control port of the power switch cell. | | `-ground` | Defines the name of the pin that connects to the ground net. | | `-name` | The name of the power switch cell. | | `-power` | Defines the name of the pin that connects to the unswitched power net. | | `-power_switchable` | Defines the name of the pin that outputs the switched power net. | | `[-acknowledge]` | Defines the name of the output control signal of the power control switch if it has one. | ### Add PDN Straps/Stripes Defines a pattern of power and ground stripes in a single layer to be added to a power grid. Example usage: ```default add_pdn_stripe -grid main_grid -layer metal1 -followpins add_pdn_stripe -grid main_grid -layer metal2 -width 0.17 -followpins add_pdn_stripe -grid main_grid -layer metal4 -width 0.48 -pitch 56.0 -offset 2 -starts_with GROUND ``` ```tcl add_pdn_stripe -layer layer_name [-extend_to_boundary] [-extend_to_core_ring] [-followpins] [-grid grid_name] [-nets list_of_nets] [-number_of_straps count] [-offset offset_value] [-pitch pitch_value] [-snap_to_grid] [-spacing spacing_value] [-starts_with POWER|GROUND] [-width width_value] [-allow_out_of_core] ``` #### Options | Switch Name | Description | |--------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-layer` | Specifies the name of the layer for these stripes. | | `[-extend_to_boundary]` | Extend the stripes to the boundary of the grid. | | `[-extend_to_core_ring]` | Extend the stripes to the core PG ring. | | `[-followpins]` | Indicates that the stripe forms part of the stdcell rails, pitch and spacing are dictated by the stdcell rows, the `-width` is not needed if it can be determined from the cells. | | `[-grid]` | Specifies the grid to which this stripe definition will be added. (Default: Last grid defined by `define_pdn_grid`). | | `[-nets]` | Limit straps to just this list of nets. | | `[-number_of_straps]` | Number of power/ground pairs to add. | | `[-offset]` | Value for the offset of the stripe from the lower left corner of the design core area. | | `[-pitch]` | Value for the distance between each power/ground pair. | | `[-snap_to_grid]` | Snap the stripes to the defined routing grid. | | `[-spacing]` | Optional specification of the spacing between power/ground pairs within a single pitch (Default: pitch / 2). | | `[-starts_with]` | Specifies whether the first strap placed will be POWER or GROUND (Default: grid setting). This cannot be used with -followpins (Flip sites when initializing floorplan to change followpin power/ground order). | | `[-width]` | Value for the width of stripe. | | `-allow_out_of_core` | Allow stripes to continue beyond the core area. | ### Add Sroute Connect The `add_sroute_connect` command is employed for connecting pins located outside of a specific power domain to the power ring, especially in cases where multiple power domains are present. During `sroute`, multi-cut vias will be added for new connections. The use of fixed vias from the technology file should be specified for the connection using the `add_sroute_connect` command. The use of max_rows and max_columns defines the row and column limit for the via stack. Example: ```default add_sroute_connect -net "VIN" -outerNet "VDD" -layers {met1 met4} -cut_pitch {200 200} -fixed_vias {M3M4_PR_M} -metalwidths {1000 1000} -metalspaces {800} -ongrid {met3 met4} -insts "temp_analog_1.a_header_0" ``` ```tcl add_sroute_connect -cut_pitch list_of_2_pitch_values -layers list_of_2_layers -net net [-fixed_vias list_of_vias] [-insts inst] [-max_columns columns] [-max_rows rows] [-metalspaces metalspaces] [-metalwidths metalwidths] [-ongrid ongrid_layers] [-outerNet outerNet] ``` #### Options | Switch Name | Description | |------------------|---------------------------------------------------------------------------------------------------------------| | `-cut_pitch` | Distances in x and y between via cuts when the two layers are parallel, e.g., overlapping stdcell rails. | | `-layers` | The metal layers for vertical stripes within inner power ring. | | `-net` | The inner net where the power ring exists. | | `[-fixed_vias]` | List of fixed vias to be used to form the via stack. | | `[-insts]` | List of all the instances that contain the pin that needs to get connected with power ring. (Default:nothing) | | `[-max_columns]` | Maximum number of columns when adding arrays of vias. (Default:10) | | `[-max_rows]` | Maximum number of rows when adding arrays of vias. (Default:10) | | `[-metalspaces]` | Spacing of each metal layer. | | `[-metalwidths]` | Width for each metal layer. | | `[-ongrid]` | List of intermediate layers in a via stack to snap onto a routing grid. | | `[-outerNet]` | The outer net where instances/pins that need to get connected exist. | ### Add PDN Ring The `add_pdn_ring` command is used to define power/ground rings around a grid region. The ring structure is built using two layers that are orthogonal to each other. A power/ground pair will be added above and below the grid using the horizontal layer, with another power/ground pair to the left and right using the vertical layer. Together these 4 pairs of power/ground stripes form a ring around the specified grid. Power straps on these layers that are inside the enclosed region are extend to connect to the ring. Example usage: ```default add_pdn_ring -grid main_grid -layer {metal6 metal7} -widths 5.0 -spacings 3.0 -core_offset 5 ``` ```tcl add_pdn_ring -layers layer_name -spacings spacing_value|list_of_2_values -widths width_value|list_of_2_values [-add_connect] [-connect_to_pad_layers layers] [-connect_to_pads] [-core_offsets offset_value] [-extend_to_boundary] [-grid grid_name] [-nets list_of_nets] [-pad_offsets offset_value] [-starts_with POWER|GROUND] [-allow_out_of_die] ``` #### Options | Switch Name | Description | |----------------------------|-------------------------------------------------------------------------------------------------------------------------------| | `-layers` | Specifies the name of the layer for these stripes. | | `-spacings` | Optional specification of the spacing between power/ground pairs within a single pitch. (Default: pitch / 2). | | `-widths` | Value for the width of the stdcell rail. | | `[-add_connect]` | Automatically add a connection between the two layers. | | `[-connect_to_pad_layers]` | Restrict the pad pins layers to this list. | | `[-connect_to_pads]` | The core side of the pad pins will be connected to the ring. | | `[-core_offsets]` | Value for the offset of the ring from the grid region. | | `[-extend_to_boundary]` | Extend the rings to the grid boundary. | | `[-grid]` | Specifies the name of the grid to which this ring defintion will be added. (Default: Last grid created by `define_pdn_grid`). | | `[-nets]` | Limit straps to just this list of nets. | | `[-pad_offsets]` | When defining a power grid for the top level of an SoC, can be used to define the offset of ring from the pad cells. | | `[-starts_with]` | Specifies whether the first strap placed will be POWER or GROUND (Default: grid setting). | | `[-allow_out_of_die]` | If specified, the ring shapes are allowed to be outside the die boundary. This should be used with caution. | ### Add PDN Connect The `add_pdn_connect` command is used to define which layers in the power grid are to be connected together. During power grid generation, vias will be added for overlapping power nets and overlapping ground nets. The use of fixed vias from the technology file can be specified or else via stacks will be constructed using VIARULEs. If VIARULEs are not available in the technology, then fixed vias must be used. Example usage: ```default add_pdn_connect -grid main_grid -layers {metal1 metal2} -cut_pitch 0.16 add_pdn_connect -grid main_grid -layers {metal2 metal4} add_pdn_connect -grid main_grid -layers {metal4 metal7} add_pdn_connect -grid ram -layers {metal4 metal5} add_pdn_connect -grid ram -layers {metal5 metal6} add_pdn_connect -grid ram -layers {metal6 metal7} add_pdn_connect -grid rotated_rams -layers {metal4 metal6} add_pdn_connect -grid rotated_rams -layers {metal6 metal7} ``` ```tcl add_pdn_connect -layers list_of_two_layers [-cut_pitch pitch_value] [-dont_use_vias list_of_vias] [-fixed_vias list_of_fixed_vias] [-grid grid_name] [-max_columns columns] [-max_rows rows] [-ongrid ongrid_layers] [-split_cuts split_cuts_mapping] [-split_cuts_staggered] ``` #### Options | Switch Name | Description | |---------------------------|-------------------------------------------------------------------------------------------------------------------------------------| | `-layers` | Layers to be connected where there are overlapping power or overlapping ground nets. | | `[-cut_pitch]` | When the two layers are parallel e.g. overlapping stdcell rails, specify the distance between via cuts. | | `[-dont_use_vias]` | List or pattern of vias to not use to form the via stack. | | `[-fixed_vias]` | List of fixed vias to be used to form the via stack. | | `[-grid]` | Specifies the name of the grid definition to which this connection will be added (Default: Last grid created by `define_pdn_grid`). | | `[-max_columns]` | Maximum number of columns when adding arrays of vias. | | `[-max_rows]` | Maximum number of rows when adding arrays of vias. | | `[-ongrid]` | List of intermediate layers in a via stack to snap onto a routing grid. | | `[-split_cuts]` | Specifies layers to use split cuts on with an associated pitch, for example `{metal3 0.380 metal5 0.500}`. | | `[-split_cuts_staggered]` | Specified if the split cuts should be staggered, ie. the ground vias will appear with an offset of pitch / 2. | ### Repairing power grid vias after detailed routing To remove vias which generate DRC violations after detailed placement and routing use `repair_pdn_vias`. ```tcl repair_pdn_vias [-all] [-net net_name] ``` #### Options | Switch Name | Description | |---------------|----------------------------------------| | `[-all]` | Repair vias on all supply nets. | | `[-net]` | Repair only vias on the specified net. | ## Useful Developer Commands If you are a developer, you might find these useful. More details can be found in the [source file]() or the [swig file](). | Command Name | Description | |-----------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `name_cmp` | Compare 2 input strings `obj1` and `obj2` if they are equal. | | `check_design_state` | Check if design is loaded. | | `get_layer` | Get the layer reference of layer name. | | `get_voltage_domains` | Gets a Tcl list of power domains in design. | | `match_orientation` | Checks if a given orientation `orient` is within a list of orientations `orients`. | | `get_insts` | Get Tcl list of instances. | | `get_masters` | Get Tcl list of masters. | | `get_one_to_two` | If a Tcl list has one element `{x}`, Tcl list `{x x}` is returned. If a Tcl list of two elements `{y y}`, list as is returned. Otherwise, for any other list lengths, error is triggered. | | `get_one_to_four` | Similar logic for above function, except the logic only works for lists of length one, two and four respectively. All other list lengths triggers error. | | `get_obstructions` | Get Tcl list of layers. | | `get_starts_with` | If value starts with `POWER`, return 1; else if value starts with `GROUND` return 0; else return error. | | `get_mterm` | Find master terminal. | | `get_orientations` | Get list of valid orientations. | ## Example scripts ## Defining a SoC power grid with pads ```default add_global_connection -net VDD -pin_pattern {^VDD$} -power add_global_connection -net VDD -pin_pattern {^VDDPE$} add_global_connection -net VDD -pin_pattern {^VDDCE$} add_global_connection -net VSS -pin_pattern {^VSS$} -ground add_global_connection -net VSS -pin_pattern {^VSSE$} set_voltage_domain -power VDD -ground VSS define_pdn_grid -name "Core" add_pdn_ring -grid "Core" -layers {metal8 metal9} -widths 5.0 -spacings 2.0 -core_offsets 4.5 -connect_to_pads add_pdn_stripe -followpins -layer metal1 -extend_to_core_ring add_pdn_stripe -layer metal4 -width 0.48 -pitch 56.0 -offset 2.0 -extend_to_core_ring add_pdn_stripe -layer metal7 -width 1.40 -pitch 40.0 -offset 2.0 -extend_to_core_ring add_pdn_stripe -layer metal8 -width 1.40 -pitch 40.0 -offset 2.0 -extend_to_core_ring add_pdn_stripe -layer metal9 -width 1.40 -pitch 40.0 -offset 2.0 -extend_to_core_ring add_pdn_connect -layers {metal1 metal4} add_pdn_connect -layers {metal4 metal7} add_pdn_connect -layers {metal7 metal8} add_pdn_connect -layers {metal8 metal9} add_pdn_connect -layers {metal9 metal10} pdngen ``` ## Regression tests There are a set of regression tests in `./test`. For more information, refer to this [section](../../README.md#regression-tests). Simply run the following script: ```shell ./test/regression ``` ## Limitations Currently the following assumptions are made: 1. The design is rectangular 2. The input floorplan includes the stdcell rows, placement of all macro blocks and IO pins. 3. The stdcells rows will be cut around macro placements ## FAQs Check out [GitHub discussion](https://github.com/The-OpenROAD-Project/OpenROAD/discussions/categories/q-a?discussions_q=category%3AQ%26A+pdn) about this tool. ## License BSD 3-Clause License. See [LICENSE](../../LICENSE) file. # README.html.md # Initialize Floorplan This tool initializes floorplan constraints, die/core area, and makes tracks. ## Commands #### NOTE - Parameters in square brackets `[-param param]` are optional. - Parameters without square brackets `-param2 param2` are required. ### Initialize Floorplan Do note that there are two ways of setting the floorplan dimensions. The user can either specify manually die/core area, or specify the utilization/aspect ratio. If you set both, unexpected behaviour might occur. - Method 1: Automatic die size calculation Example: `initialize_floorplan -utilization 70 -aspect_ratio 1.0 -core_space 0.0 -sites FreePDK45_38x28_10R_NP_162NW_34O` - Method 2: Set die/core area Example: `initialize_floorplan -die_area 0 0 2000 2000 -core_area 100 100 1900 1900` -sites FreePDK45_38x28_10R_NP_162NW_34O\` The die area and core area used to write ROWs can be specified explicitly with the `-die_area` and `-core_area` arguments. Alternatively, the die and core areas can be computed from the design size and utilization as shown below: The -site argument determines the basic single-height rows to make. For a hybrid row design the site should have a row pattern. Any sites referenced by an instance in the netlist will also have rows constructed for them. Additional sites are specified if you wish to have rows for a site that is not used in the nelist but may be needed later. For example, you might not have any double height cells in the incoming netlist but you expect some to be generated by flop clustering later in the flow. Example computation: ```default core_area = design_area / (utilization / 100) core_width = sqrt(core_area / aspect_ratio) core_height = core_width * aspect_ratio core = ( core_space_left, core_space_bottom ) ( core_space_left + core_width, core_space_bottom + core_height ) die = ( 0, 0 ) ( core_width + core_space_left + core_space_right, core_height + core_space_bottom + core_space_top ) ``` ```tcl initialize_floorplan (-die_area {llx lly urx ury | x1 y1 x2 y2 ...} -core_area {llx lly urx ury | x1 y1 x2 y2 ...}) | (-utilization util -core_space (space | {bottom top left right}) [-aspect_ratio ratio]) -site site_name [-additional_sites site_names] [-flip_sites site_names] [-gap space] [-row_parity NONE|EVEN|ODD] ``` #### Options | Switch Name | Description | |-----------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-core_area` | Core area coordinates in microns. Either a rectangle as `{llx lly urx ury}`, or a rectilinear polygon as a list of vertex coordinates `{x1 y1 x2 y2 ...}`. See [Rectilinear Floorplans](). | | `-core_space` | Space around the core in microns. Allowed values are either one value for all margins or a set of four values, one for each margin. The order of the four values are: `{bottom top left right}`. | | `-die_area` | Die area coordinates in microns. Either a rectangle as `{llx lly urx ury}`, or a rectilinear polygon as a list of vertex coordinates `{x1 y1 x2 y2 ...}`. See [Rectilinear Floorplans](). | | `-site` | Site name. | | `-utilization` | Percentage utilization. Allowed values are `double` in the range `(0-100]`. | | `[-additional_sites]` | Tcl list of sites to make rows for (e.g. `{SITEXX, SITEYY}`) | | `[-aspect_ratio]` | Ratio $\frac{height}{width}$. The default value is `1.0` and the allowed values are floats `[0, 1.0]`. | | `[-flip_sites]` | Flip the orientations of rows matching these sites. Sites listed under this option will create `FS`-oriented rows at even indices and `N`-oriented rows at odd ones, and vice versa for sites not listed under this option. (e.g. `{SITEXX, SITEYY}`) | | `[-gap]` | Space between power domains in microns. The default value is 6 times the minimum site height. | | `[-row_parity]` | Snap to either an odd (`ODD`) or even (`EVEN`) number of rows. Defaults to `NONE` (no constraint on parity). | ### Rectilinear Floorplans The `initialize_floorplan` command supports non-rectangular die and core outlines (e.g. L-shapes, T-shapes, or arbitrary rectilinear polygons). Rectilinear mode is selected automatically when `-die_area` is given more than four coordinates. When rectilinear mode is used, `-core_area` must also be specified as a polygon (it is not derived from `-utilization`, `-aspect_ratio`, or `-core_space`). Example: an L-shaped die with a matching L-shaped core, with a 20 micron margin between them. ```tcl initialize_floorplan \ -die_area {0 0 200 0 200 100 100 100 100 200 0 200} \ -core_area {20 20 180 20 180 80 80 80 80 180 20 180} \ -site FreePDK45_38x28_10R_NP_162NW_34O ``` Rows are generated only inside the polygonal core, respecting its rectilinear edges. #### Polygon Vertex Rules - Coordinates are in microns, listed as `{x1 y1 x2 y2 ... xN yN}`. - The vertex count must be even (each `x` paired with a `y`). - Exactly 4 coordinates are interpreted as a rectangle. A polygon must have more than 4 coordinates and at least 4 vertices (8 coordinates). - Edges must be axis-aligned (rectilinear): consecutive vertices must share either an `x` or a `y` coordinate. - The die polygon must fully contain the core polygon. ### Make Tracks The `initialize_floorplan` command removes existing tracks. Use the `make_tracks` command to add routing tracks to a floorplan. ```tcl make_tracks [layer] [-x_offset x_offset] [-y_offset y_offset] [-x_pitch x_pitch] [-y_pitch y_pitch] ``` #### Options | Switch Name | Description | |------------------------------|-------------------------------------------------------------------------------------------| | `[layer]` | Select layer name to make tracks for. Defaults to all layers. | | `[-x_offset]`, `[-y_offset]` | If set, overrides the LEF technology x-/y- offset. Use the same unit as in the LEFT file. | | `[-x_pitch]`, `[-y_pitch]` | If set, overrides the LEF technology x-/y- pitch. Use the same unit as in the LEF file. | ### Make Rows The `make_rows` command removes existing rows. Use the `make_rows` command to add rows to an existing floorplan. Useful, if your floorplan is stored as a floorplan def without rows. ```tcl make_rows (-core_area {llx lly urx ury}) | (-core_space (space | {bottom top left right})) -site site_name [-additional_sites site_names] [-flip_sites site_names] [-gap space] [-row_parity NONE|EVEN|ODD] ``` #### Options | Switch Name | Description | |-----------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-core_area` | Core area coordinates in microns (lower left x/y and upper right x/y coordinates). | | `-core_space` | Space around the core in microns. Allowed values are either one value for all margins or a set of four values, one for each margin. The order of the four values are: `{bottom top left right}`. | | `-site` | Site name. | | `[-additional_sites]` | Tcl list of sites to make rows for (e.g. `{SITEXX, SITEYY}`) | | `[-flip_sites]` | Flip the orientations of rows matching these sites. Sites listed under this option will create `FS`-oriented rows at even indices and `N`-oriented rows at odd ones, and vice versa for sites not listed under this option. (e.g. `{SITEXX, SITEYY}`) | | `[-gap]` | Space between power domains in microns. The default value is 6 times the minimum site height. | | `[-row_parity]` | Snap to either an odd (`ODD`) or even (`EVEN`) number of rows. Defaults to `NONE` (no constraint on parity). | ### Insert tieoff cells This comamnd inserts tiecells. ```tcl insert_tiecells [-prefix inst_prefix] tie_pin ``` #### Options | Switch Name | Description | |---------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `[-prefix]` | Used to control the prefix of the new tiecell names. This will default to `TIEOFF_`. | | `tie_pin` | Indicates the master and port to use to tie off nets. For example, `LOGIC0_X1/Z` for the Nangate45 library, where `LOGIC0_X1` is the master and `Z` is the output port on the master. | ## Useful Developer Commands If you are a developer, you might find these useful. More details can be found in the [source file](./src/InitFloorplan.cc) or the [swig file](). | Command Name | Description | |-----------------------|--------------------------------------------| | `microns_to_mfg_grid` | Convert microns to manufacturing grid DBU. | ## Example scripts Example scripts on running `ifp` for a sample design of `mpd_top` are as follows: ```default ./test/upf_test.tcl ``` ## Regression tests There are a set of regression tests in `./test`. For more information, refer to this [section](../../README.md#regression-tests). Simply run the following script: ```shell ./test/regression ``` ## Limitations ## FAQs Check out [GitHub discussion](https://github.com/The-OpenROAD-Project/OpenROAD/discussions/categories/q-a?discussions_q=category%3AQ%26A+ifp+in%3Atitle) about this tool. ## License BSD 3-Clause License. See [LICENSE](../../LICENSE) file. # README.html.md # Tapcell Tapcell and endcap insertion. ## Commands #### NOTE - Parameters in square brackets `[-param param]` are optional. - Parameters without square brackets `-param2 param2` are required. ### Add Tapcell/Endcap This command inserts tapcells or endcaps. The figures below show two examples of tapcell insertion. When only the `-tapcell_master` and `-endcap_master` masters are given, the tapcell placement is similar to Figure 1. When the remaining masters are give, the tapcell placement is similar to Figure 2. | ![image](main/src/tap/doc/image/tapcell_example1.svg) | ![image](main/src/tap/doc/image/tapcell_example2.svg) | |---------------------------------------------------------|----------------------------------------------------------| | Figure 1: Tapcell insertion representation | Figure 2: Tapcell insertion around macro representation | ```tcl tapcell [-cnrcap_nwin_master cnrcap_nwin_master] [-cnrcap_nwout_master cnrcap_nwout_master] [-disallow_one_site_gaps] [-distance dist] [-endcap_cpp endcap_cpp] [-endcap_master endcap_master] [-endcap_prefix endcap_prefix] [-halo_width_x halo_x] [-halo_width_y halo_y] [-incnrcap_nwin_master incnrcap_nwin_master] [-incnrcap_nwout_master incnrcap_nwout_master] [-no_cell_at_top_bottom] [-row_min_width min_width] [-tap_nwin2_master tap_nwin2_master] [-tap_nwin3_master tap_nwin3_master] [-tap_nwintie_master tap_nwintie_master] [-tap_nwout2_master tap_nwout2_master] [-tap_nwout3_master tap_nwout3_master] [-tap_nwouttie_master tap_nwouttie_master] [-tap_prefix tap_prefix] [-tapcell_master tapcell_master] [-tbtie_cpp tbtie_cpp] ``` #### Options | Switch Name | Description | |-----------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------| | `[-cnrcap_nwin_master]` | Macro cell placed at the corners the core area according the row orientation. | | `[-cnrcap_nwout_master]` | Macro cell placed at the corners the core area according the row orientation. | | `[-disallow_one_site_gaps]` | Option is deprecated. | | `[-distance]` | Distance (in microns) between each tapcell in the checkerboard. | | `[-endcap_cpp]` | Option is deprecated. | | `[-endcap_master]` | Master used as an endcap. | | `[-endcap_prefix]` | Prefix for the endcaps instances. The default value is `PHY_`. | | `[-halo_width_x]` | Horizontal halo size (in microns) around macros during cut rows. | | `[-halo_width_y]` | Vertical halo size (in microns) around macros during cut rows. | | `[-incnrcap_nwin_master]` | Master cell placed at the corners of macros, according the row orientation. | | `[-incnrcap_nwout_master]` | Master cell placed at the corners of macros, according the row orientation. | | `[-no_cell_at_top_bottom]` | Option is deprecated. | | `[-row_min_width]` | Minimum width (in microns) that a row must have during cut rows. | | `[-tap_nwin2_master]` | Master cell placed at the top and bottom of macros and the core area according the row orientation. This master should be smaller than `tap_nwintie_master` | | `[-tap_nwin3_master]` | Master cell placed at the top and bottom of macros and the core area according the row orientation. This master should be smaller than `tap_nwin2_master`. | | `[-tap_nwintie_master]` | Master cell placed at the top and bottom of macros and the core area according the row orientation. | | `[-tap_nwout2_master]` | Master cell placed at the top and bottom of macros and the core area according the row orientation. This master should be smaller than `tap_nwouttie_master`. | | `[-tap_nwout3_master]` | Master cell placed at the top and bottom of macros and the core area according the row orientation. This master should be smaller than `tap_nwout2_master`. | | `[-tap_nwouttie_master]` | Master cell placed at the top and bottom of macros and the core area according the row orientation. | | `[-tap_prefix]` | Prefix for the tapcell instances. The default value is `TAP_`. | | `[-tapcell_master]` | Master used as a tapcell. | | `[-tbtie_cpp]` | Option is deprecated. | ### Cut Rows This command cuts rows. ```tcl cut_rows [-endcap_master endcap_master] [-halo_width_x halo_x] [-halo_width_y halo_y] [-row_min_width min_width] ``` #### Options | Switch Name | Description | |--------------------|------------------------------------------------------------------| | `[-endcap_master]` | Master used as an endcap. | | `[-halo_width_x]` | Horizontal halo size (in microns) around macros during cut rows. | | `[-halo_width_y]` | Vertical halo size (in microns) around macros during cut rows. | | `[-row_min_width]` | Minimum width (in microns) that a row must have during cut rows. | ### Only adding boundary/endcap cells Place endcaps into the design, the naming for the arguments to `place_endcaps` is based on the LEF58 `CLASS` specification for endcaps. ```tcl place_endcaps [-bottom_edge masters] [-corner master] [-edge_corner master] [-endcap masters] [-endcap_horizontal masters] [-endcap_vertical master] [-left_bottom_corner master] [-left_bottom_edge master] [-left_edge master] [-left_top_corner master] [-left_top_edge master] [-right_bottom_corner master] [-right_bottom_edge master] [-right_edge master] [-right_top_corner master] [-right_top_edge master] [-prefix prefix] [-top_edge masters] ``` #### Options | Switch Name | Description | |--------------------------|-------------------------------------------------------------------------------------------| | `[-bottom_edge]` | List of masters for the bottom row endcaps. (overrides `-endcap_horizontal`). | | `[-corner]` | Master for the corner cells on the outer corners. | | `[-edge_corner]` | Master for the corner cells on the inner corners. | | `[-endcap]` | Master used as an endcap. | | `[-endcap_horizontal]` | List of masters for the top and bottom row endcaps. (overrides `-endcap`). | | `[-endcap_vertical]` | Master for the left and right row endcaps. (overrides `-endcap`). | | `[-left_bottom_corner]` | Master for the corner cells on the outer bottom left corner. (overrides `-corner`). | | `[-left_bottom_edge]` | Master for the corner cells on the inner bottom left corner. (overrides `-edge_corner`). | | `[-left_edge]` | Master for the left row endcaps. (overrides `-endcap_vertical`). | | `[-left_top_corner]` | Master for the corner cells on the outer top left corner. (overrides `-corner`). | | `[-left_top_edge]` | Master for the corner cells on the inner top left corner. (overrides `-edge_corner`). | | `[-right_bottom_corner]` | Master for the corner cells on the outer bottom right corner. (overrides `-corner`). | | `[-right_bottom_edge]` | Master for the corner cells on the inner bottom right corner. (overrides `-edge_corner`). | | `[-right_edge]` | Master for the right row endcaps. (overrides `-endcap_vertical`). | | `[-right_top_corner]` | Master for the corner cells on the outer top right corner. (overrides `-corner`). | | `[-right_top_edge]` | Master for the corner cells on the inner top right corner. (overrides `-edge_corner`). | | `[-prefix]` | Prefix to use for the boundary cells. The default value is `PHY_`. | | `[-top_edge]` | List of masters for the top row endcaps. (overrides `-endcap_horizontal`). | ### Only adding Tapcells This command is used for tapcell placement only. ```tcl place_tapcells -distance dist -master tapcell_master ``` #### Options | Switch Name | Description | |---------------|---------------------------------| | `-distance` | Distance between tapcells. | | `-master` | Master to use for the tapcells. | ### Remove Tapcells/Endcaps This command is used for removing tapcells or endcaps based on their prefix. ```tcl tapcell_ripup [-endcap_prefix endcap_prefix] [-tap_prefix tap_prefix] ``` #### Options | Switch Name | Description | |--------------------|----------------------------------------------------------------| | `[-endcap_prefix]` | Remove endcaps with said prefix. The default value is `PHY_`. | | `[-tap_prefix]` | Remove tapcells with said prefix. The default value is `TAP_`. | ## Example scripts You can find script examples for both 45nm and 14nm in `./etc/scripts` ```default ./etc/scripts/example_14nm.tcl ./etc/scripts/example_45nm.tcl ``` ## Regression tests There are a set of regression tests in `./test`. For more information, refer to this [section](../../README.md#regression-tests). Simply run the following script: ```shell ./test/regression ``` ## Limitations ## FAQs Check out [GitHub discussion](https://github.com/The-OpenROAD-Project/OpenROAD/discussions/categories/q-a?discussions_q=category%3AQ%26A+tap+in%3Atitle) about this tool. ## License BSD 3-Clause License. See [LICENSE](../../LICENSE) file. # README.html.md # Read UPF Utility This module contains functionality to read, and modify information from Unified Power Format (UPF) files. ## Commands #### NOTE - Parameters in square brackets `[-param param]` are optional. - Parameters without square brackets `-param2 param2` are required. ### Read UPF Sources the UPF file. ```tcl read_upf -file file ``` #### Options | Switch Name | Description | |---------------|----------------------| | `-file` | Path to `.upf` file. | ### Write UPF Writes the UPF file. ```tcl write_upf file_name ``` #### Options | Switch Name | Description | |---------------|--------------------| | `file_name` | Filename argument. | ### Create Power Domain This command creates power domain for a group of modules. ```tcl create_power_domain [-elements elements] name ``` #### Options | Switch Name | Description | |---------------|--------------------------------------------------------------------------| | `-elements` | List of module paths that belong this this domain OR `.` for top domain. | | `name` | Domain name. | ### Create Logic Port This command creates logic port. Direction must be specified from: `in`, `out`, `inout`. ```tcl create_logic_port [-direction direction] port_name ``` #### Options | Switch Name | Description | |---------------|-----------------------------------------------| | `-direction` | Direction of the port (`in`, `out`, `inout`). | | `port_name` | Port name. | ### Create Power Switch This command creates power switch. ```tcl create_power_switch [-domain domain] [-output_supply_port output_supply_port] [-input_supply_port input_supply_port] [-control_port control_port] [-on_state on_state] name ``` #### Options | Switch Name | Description | |-----------------------|-------------------------------------------------------------------| | `-domain` | Power domain name. | | `-output_supply_port` | Output supply port of the switch. | | `-input_supply_port` | Input supply port of the switch. | | `-control_port` | Control port on the switch. | | `-on_state` | One of {`state_name`, `input_supply_port`, `boolean_expression`}. | | `name` | Power switch name. | ### Create or Update Isolation Strategy This command creates or update isolation strategy. ```tcl set_isolation [-domain domain] [-applies_to applies_to] [-clamp_value clamp_value] [-isolation_signal isolation_signal] [-isolation_sense isolation_sense] [-location location] [-update] name ``` #### Options | Switch Name | Description | |---------------------|------------------------------------------------------------------------------------------------------| | `-domain` | Power domain | | `-applies_to` | Restricts the strategy to apply one of these (`inputs`, `outputs`, `both`), default value is `both`. | | `-clamp_value` | Value the isolation can drive (`0`, `1`). | | `-isolation_signal` | The control signal for this strategy. | | `-isolation_sense` | The active level of isolation control signal (`high`, `low`), default value is `high`. | | `-location` | Domain in which isolation cells are placed (`parent`, `self`, `fanout`), default value is `self`. | | `-update` | Only available if using existing strategy, will error if the strategy doesn’t exist. | | `name` | Isolation strategy name. | ### Set Interface cell This command sets the interface cell. ```tcl use_interface_cell -domain domain -strategy strategy -lib_cells lib_cells interface_implementation_name ``` #### Options | Switch Name | Description | |---------------------------------|--------------------------------------------------| | `-domain` | Power domain name. | | `-strategy` | Isolation strategy name. | | `-lib_cells` | List of lib cells that could be used. | | `interface_implementation_name` | For compatibility only. OpenRoad doesn’t use it. | ### Set Domain Area This command sets the power domain area. ```tcl set_domain_area domain_name -area {llx lly urx ury} ``` #### Options | Switch Name | Description | |---------------|---------------------------------------------------------------------------------------------------| | `domain_name` | Power domain name. | | `-area` | x-/y- coordinates in microns for the lower left and upper right corners of the power domain area. | ### Map existing power switch This command maps existing power switch. ```tcl map_power_switch [-switch_name_list switch_name_list] [-lib_cells lib_cells] [-port_map port_map] ``` #### Options | Switch Name | Description | |---------------------|-----------------------------------------------------------------------------------| | `-switch_name_list` | A list of switches (as defined by create_power_switch) to map. | | `-lib_cells` | A list of library cells that could be mapped to the power switch | | `-port_map` | A map that associates model ports defined by create_power_switch to logical ports | ### Set Level Shifter This command sets level shifter. Options coming soon. ```tcl set_level_shifter [-domain domain] \ [-elements elements] \ [-exclude_elements exclude_elements] \ [-source source] \ [-sink sink] \ [-use_functional_equivalence use_functional_equivalence] \ [-applies_to applies_to] \ [-applies_to_boundary applies_to_boundary] \ [-rule rule] \ [-threshold threshold] \ [-no_shift] \ [-force_shift] \ [-location location] \ [-input_supply input_supply] \ [-output_supply output_supply] \ [-internal_supply internal_supply] \ [-name_prefix name_prefix] \ [-name_suffix name_suffix] \ [-instance instance] \ [-update] \ [-use_equivalence use_equivalence] \ name ``` #### Options | Switch Name | Description | |-------------------------------|---------------| | `-domain` | | | `-elements` | | | `-exclude_elements` | | | `-source` | | | `-sink` | | | `-use_functional_equivalence` | | | `-applies_to` | | | `-applies_to_boundary` | | | `-rule` | | | `-threshold` | | | `-no_shift` | | | `-force_shift` | | | `-location` | | | `-input_supply` | | | `-output_supply` | | | `-internal_supply` | | | `-name_prefix` | | | `-name_suffix` | | | `-instance` | | | `-update` | | | `-use_equivalence` | | | `name` | | ### Set Domain Voltage This command sets the voltage of a power domain. ```tcl set_domain_voltage [-domain domain] \ [-voltage voltage] ``` #### Options | Switch Name | Description | |---------------|-------------------------------------------------------------------------------| | `-domain` | Power domain name. | | `-voltage` | Power domain voltage. The allowed values are `float`, default value is `0.0`. | ### Set Level Shifter Cell This command sets the library cell used for level shifter. ```tcl set_level_shifter_cell [-level_shifter level_shifter] \ [-cell_name cell_name] \ [-input_port input_port] \ [-output_port output_port] ``` #### Options | Switch Name | Description | |------------------|---------------| | `-level_shifter` | KIV. | | `-cell_name` | KIV. | | `-input_port` | KIV. | | `-output_port` | KIV. | ## Example scripts Example script demonstrating how to run `upf` related commands can be found here: ```default ./test/upf_test.tcl ``` ## Regression tests There are a set of regression tests in `./test`. For more information, refer to this [section](../../README.md#regression-tests). Simply run the following script: ```shell ./test/regression ``` ## Limitations ## FAQs Check out [GitHub discussion](https://github.com/The-OpenROAD-Project/OpenROAD/discussions/categories/q-a?discussions_q=category%3AQ%26A+upf) about this tool. ## License BSD 3-Clause License. See [LICENSE](../../LICENSE) file. # README.html.md # Rectilinear Steiner Tree The steiner tree (`stt`) module in OpenROAD constructs steiner trees used in the global routing (`grt`) module. Documentation is current under construction. ## Commands #### NOTE - Parameters in square brackets `[-param param]` are optional. - Parameters without square brackets `-param2 param2` are required. ### Set Routing Alpha This command sets routing alphas for a given net `net_name`. By default the global router uses heuristic rectilinear Steiner minimum trees (RSMTs) as an initial basis to construct route guides. An RSMT tries to minimize the total wirelength needed to connect a given set of pins. The Prim-Dijkstra heuristic is an alternative net topology algorithm that supports a trade-off between total wirelength and maximum path depth from the net driver to its loads. The `set_routing_alpha` command enables the Prim/Dijkstra algorithm and sets the alpha parameter used to trade-off wirelength and path depth. Alpha is between 0.0 and 1.0. When alpha is 0.0 the net topology minimizes total wirelength (i.e. capacitance). When alpha is 1.0 it minimizes longest path between the driver and loads (i.e., maximum resistance). Typical values are 0.4-0.8. You can call it multiple times for different nets. Example: `set_routing_alpha -net clk 0.3` sets the alpha value of 0.3 for net *clk*. ```tcl set_routing_alpha [-net net_name] [-min_fanout fanout] [-min_hpwl hpwl] [-clock_nets] alpha ``` #### Options | Switch Name | Description | |---------------|-----------------------------------------------------------------------------------| | `-net` | Net name. | | `-min_fanout` | Set the minimum number for fanout. | | `-min_hpwl` | Set the minimum half-perimetere wirelength (microns). | | `-clock_nets` | If this flag is set to True, only clock nets will be modified. | | `alpha` | Float between 0 and 1 describing the trade-off between wirelength and path depth. | ## Example scripts ## Regression tests There are a set of regression tests in `./test`. For more information, refer to this [section](../../README.md#regression-tests). Simply run the following script: ```shell ./test/regression ``` ## Limitations ## FAQs Check out [GitHub discussion](https://github.com/The-OpenROAD-Project/OpenROAD/discussions/categories/q-a?discussions_q=category%3AQ%26A+stt+in%3Atitle) about this tool. ## References ## License BSD 3-Clause License. See [LICENSE](../../LICENSE) file. # README.html.md # Flute3 Flute3 is an open-source rectilinear Steiner minimum tree heuristic with improvements made by UFRGS students and James Cherry. This tool is used for the calculation of wirelength in `grt` and `rsz`. The version in this repository uses CMake and C++ namespace, and has dynamic memory allocation. Flute3 can handle nets with any degree. ## External references (Optional) The algorithm base is Flute3.1, extracted from the FastRoute4.1 version that was received from [yuexu@iastate.edu](mailto:yuexu@iastate.edu) on June 15, 2019, with the BSD-3 open source license as given in the FastRoute [website](https://home.engineering.iastate.edu/~cnchu/FastRoute.html#License). ## License See [LICENSE](../../../../LICENSE) file. # README.html.md # Gate Resizer Gate Resizer commands are described below. The `resizer` commands stop when the design area is `-max_utilization util` percent of the core area. `util` is between 0 and 100. The `resizer` stops and reports an error if the max utilization is exceeded. ## Commands #### NOTE - Parameters in square brackets `[-param param]` are optional. - Parameters without square brackets `-param2 param2` are required. ### Set Don’t Use The `set_dont_use` command removes library cells from consideration by the `resizer` engine and the `CTS` engine. `lib_cells` is a list of cells returned by `get_lib_cells` or a list of cell names (`wildcards` allowed). For example, `DLY*` says do not use cells with names that begin with `DLY` in all libraries. ```tcl set_dont_use lib_cells ``` ### Unset Don’t Use The `unset_dont_use` command reverses the `set_dont_use` command. ```tcl unset_dont_use lib_cells ``` ### Reset Don’t Use The `reset_dont_use` restores the default dont use list. ```tcl reset_dont_use ``` ### Report Don’t Use The `report_dont_use` reports all the cells that are marked as dont use. ```tcl report_dont_use ``` ### Set Don’t Touch The `set_dont_touch` command prevents the resizer commands from modifying instances or nets. ```tcl set_dont_touch instances_nets ``` ### Unset Don’t Touch The `unset_dont_touch` command reverse the `set_dont_touch` command. ```tcl unset_dont_touch instances_nets ``` ### Report Don’t Touch The `report_dont_touch` reports all the instances and nets that are marked as dont touch. ```tcl report_dont_touch ``` ### Buffer Ports The `buffer_ports -inputs` command adds a buffer between the input and its loads. The `buffer_ports -outputs` adds a buffer between the port driver and the output port. Inserting buffers on input and output ports makes the block input capacitances and output drives independent of the block internals. It uses the buffer library cell defined by `-buffer_cell` if it is given. ```tcl buffer_ports [-inputs] [-outputs] [-max_utilization util] [-buffer_cell buf_cell] [-verbose] ``` #### Options | Switch Name | Description | |-----------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------| | `-inputs`, `-outputs` | Insert a buffer between the input and load, output and load respectively. The default behavior is `-inputs` and `-outputs` set if neither is specified. | | `-max_utilization` | Defines the percentage of core area used. | | `-buffer_cell` | Specifies the buffer cell type to be used. | | `-verbose` | Enable verbose logging. | #### Instance Name Prefixes `buffer_ports` uses the following prefixes for the buffer instances that it inserts: | Instance Prefix | Purpose | |-------------------|---------------------------| | input | Buffering primary inputs | | output | Buffering primary outputs | ### Remove Buffers Use the `remove_buffers` command to remove buffers inserted by synthesis. This step is recommended before using `repair_design` so that there is more flexibility in buffering nets. If buffer instances are specified, only specified buffer instances will be removed regardless of dont-touch or fixed cell. Direct input port to output port feedthrough buffers will not be removed. If no buffer instances are specified, all buffers will be removed except those that are associated with dont-touch, fixed cell or direct input port to output port feedthrough buffering. ```tcl remove_buffers [ instances ] ``` ### Balance Row Usage Command description pending. ```tcl balance_row_usage ``` ### Repair Design The `repair_design` command inserts buffers on nets to repair max slew, max capacitance and max fanout violations, and on long wires to reduce RC delay in the wire. It also resizes gates to normalize slews. Use `estimate_parasitics -placement` before `repair_design` to estimate parasitics considered during repair. Placement-based parasitics cannot accurately predict routed parasitics, so a margin can be used to “over-repair” the design to compensate. ```tcl repair_design [-max_wire_length max_length] [-slew_margin slew_margin] [-cap_margin cap_margin] [-max_utilization util] [-pre_placement] [-buffer_gain float_value] (deprecated) [-match_cell_footprint] [-verbose] ``` #### Options | Switch Name | Description | |-------------------------|--------------------------------------------------------------------------------------------------------------------------------------------| | `-max_wire_length` | Maximum length of wires (in microns), defaults to a value that minimizes the wire delay for the wire RC values specified by `set_wire_rc`. | | `-slew_margin` | Add a slew margin. The default value is `0`, the allowed values are integers `[0, 100]`. | | `-cap_margin` | Add a capactitance margin. The default value is `0`, the allowed values are integers `[0, 100]`. | | `-max_utilization` | Defines the percentage of core area used. | | `-pre_placement` | Enables performing an initial pre-placement sizing and buffering round. | | `-buffer_gain` | Deprecated alias for `-pre_placement`. The passed value is ignored. | | `-match_cell_footprint` | Obey the Liberty cell footprint when swapping gates. | | `-verbose` | Enable verbose logging on progress of the repair. | #### Instance Name Prefixes `repair_design` uses the following prefixes for the buffer instances that it inserts: | Instance Prefix | Purpose | |-------------------|-------------------------------------------------------------------------------| | fanout | Fixing max fanout | | gain | Gain based buffering | | load_slew | Fixing max transition violations | | max_cap | Fixing max capacitance | | max_length | Fixing max length | | wire | Repairs load slew, length, and max capacitance violations in net wire segment | ### Repair Tie Fanout The `repair_tie_fanout` command connects each tie high/low load to a copy of the tie high/low cell. ```tcl repair_tie_fanout [-separation dist] [-max_fanout fanout] [-verbose] lib_port ``` #### Options | Switch Name | Description | |---------------|------------------------------------------------------------------------------------------------| | `-separation` | Tie high/low insts are separated from the load by this value (Liberty units, usually microns). | | `-verbose` | Enable verbose logging of repair progress. | | `lib_port` | Tie high/low port, which can be a library/cell/port name or object returned by `get_lib_pins`. | ### Repair Timing The `repair_timing` command repairs setup and hold violations. It should be run after clock tree synthesis with propagated clocks. Setup repair is done before hold repair so that hold repair does not cause setup checks to fail. The worst setup path is always repaired. Next, violating paths to endpoints are repaired to reduced the total negative slack. ```tcl repair_timing [-setup] [-hold] [-recover_power percent_of_paths_with_slack] [-setup_margin setup_margin] [-hold_margin hold_margin] [-slack_margin slack_margin] [-libraries libs] [-allow_setup_violations] [-sequence] [-phases] [-skip_pin_swap] [-skip_gate_cloning] [-skip_size_down_fanout] [-skip_buffering] [-skip_buffer_removal] [-skip_last_gasp] [-skip_vt_swap] [-skip_crit_vt_swap] [-repair_tns tns_end_percent] [-max_passes passes] [-max_iterations iterations] [-max_repairs_per_pass max_repairs_per_pass] [-max_utilization util] [-max_buffer_percent buffer_percent] [-match_cell_footprint] [-verbose] ``` #### Options | Switch Name | Description | |---------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-setup` | Repair setup timing. | | `-hold` | Repair hold timing. | | `-recover_power` | Set the percentage of paths to recover power for. The default value is `0`, and the allowed values are floats `(0, 100]`. | | `-setup_margin` | Add additional setup slack margin. | | `-hold_margin` | Add additional hold slack margin. | | `-allow_setup_violations` | While repairing hold violations, buffers are not inserted that will cause setup violations unless `-allow_setup_violations` is specified. | | `-sequence` | Specify a particular order of setup timing optimization moves. The default is “unbuffer vt_swap sizeup swap buffer clone split”. Obeys skip flags also. | | `-phases` | Specify a particular order of setup timing optimization phases. The default is “LEGACY LAST_GASP CRIT_VT_SWAP”. | | `-skip_pin_swap` | Flag to skip pin swap. The default is to perform pin swap transform during setup fixing. | | `-skip_gate_cloning` | Flag to skip gate cloning. The default is to perform gate cloning transform during setup fixing. | | `-skip_size_down_fanout` | Flag to skip fanout gate down sizing. The default is to perform non-critical fanout gate down sizing transform during setup fixing. | | `-skip_buffering` | Flag to skip rebuffering and load splitting. The default is to perform rebuffering and load splitting transforms during setup fixing. | | `-skip_buffer_removal` | Flag to skip buffer removal. The default is to perform buffer removal transform during setup fixing. | | `-skip_last_gasp` | Flag to skip final (“last gasp”) optimizations. The default is to perform greedy sizing at the end of optimization. | | `-skip_vt_swap` | Flag to skip threshold voltage (VT) swap optimizations. The default is to perform VT swap optimization to improve timing QoR. | | `-skip_crit_vt_swap` | Flag to skip critical threshold voltage (VT) swap optimizations at the end of optimization. The default is to perform critical VT swap optimization to improve timing QoR beyond repairing just the worst path per each violating endpoint. | | `-repair_tns` | Percentage of violating endpoints to repair (0-100). When `tns_end_percent` is zero, only the worst endpoint is repaired. When `tns_end_percent` is 100 (default), all violating endpoints are repaired. | | `-max_repairs_per_pass` | Maximum repairs per pass, default is 1. On the worst paths, the maximum number of repairs is attempted. It gradually decreases until the final violations which only get 1 repair per pass. | | `-max_utilization` | Defines the percentage of core area used. | | `-max_iterations` | Defines the maximum number of iterations executed when repairing setup and hold violations. The default is `-1`, which disables the limit of iterations. | | `-max_buffer_percent` | Specify a maximum number of buffers to insert to repair hold violations as a percentage of the number of instances in the design. The default value is `20`, and the allowed values are integers `[0, 100]`. | | `-match_cell_footprint` | Obey the Liberty cell footprint when swapping gates. | | `-verbose` | Enable verbose logging of the repair progress. | Use`-recover_power` to specify the percent of paths with positive slack which will be considered for gate resizing to save power. It is recommended that this option be used with global routing based parasitics. #### Instance Name Prefixes `repair_timing` uses the following prefixes for the buffer and gate instances that it inserts: | Instance Prefix | Purpose | |-------------------|-------------------------------------------------------------| | clone | Gate cloning | | hold | Hold fixing | | rebuffer | Buffering for setup fixing | | split | Split off non-critical loads behind a buffer to reduce load | ### Repair Clock Nets The `clock_tree_synthesis` command inserts a clock tree in the design but may leave a long wire from the clock input pin to the clock tree root buffer. The `repair_clock_nets` command inserts buffers in the wire from the clock input pin to the clock root buffer. ```tcl repair_clock_nets [-max_wire_length max_wire_length] ``` #### Options | Switch Name | Description | |--------------------|--------------------------------------------------------------------------------------------------------------------------------------------| | `-max_wire_length` | Maximum length of wires (in microns), defaults to a value that minimizes the wire delay for the wire RC values specified by `set_wire_rc`. | ### Repair Clock Inverters The repair_clock_inverters command replaces an inverter in the clock tree with multiple fanouts with one inverter per fanout. This prevents the inverter from splitting up the clock tree seen by CTS. It should be run before clock_tree_synthesis. ```tcl repair_clock_inverters ``` ### Report Design Area The `report_design_area` command reports the area of the design’s components and the utilization. ```tcl report_design_area ``` ### Report Floating Nets The `report_floating_nets` command reports nets with connected loads but no connected drivers. ```tcl report_floating_nets [-verbose] ``` ### Report Overdriven Nets The `report_overdriven_nets` command reports nets with connected by multiple drivers. ```tcl report_overdriven_nets [-include_parallel_driven] [-verbose] ``` #### Options | Switch Name | Description | |----------------------------|------------------------------------------------------------| | `-include_parallel_driven` | Include nets that are driven by multiple parallel drivers. | | `-verbose` | Print the net names. | ### Eliminate Dead Logic The `eliminate_dead_logic` command eliminates dead logic, i.e. it removes standard cell instances which can be removed without affecting the function of the design. ```tcl eliminate_dead_logic ``` #### Options | Switch Name | Description | |---------------|----------------------| | `-verbose` | Print the net names. | ## Useful Developer Commands If you are a developer, you might find these useful. More details can be found in the [source file](./src/Resizer.cc) or the [swig file](./src/Resizer.i). | Command Name | Description | |----------------------------|------------------------------------------------------------------------------------------| | `repair_setup_pin` | Repair setup pin violation. | | `parse_time_margin_arg` | Get the raw value for timing margin (e.g. `slack_margin`, `setup_margin`, `hold_margin`) | | `parse_percent_margin_arg` | Get the above margin in perentage format. | | `parse_margin_arg` | Same as `parse_percent_margin_arg`. | | `parse_max_util` | Check maximum utilization. | | `parse_max_wire_length` | Get maximum wirelength. | | `check_max_wire_length` | Check if wirelength is allowed by rsz for minimum delay. | ### Setting Optimization Configuration The `set_opt_config` command configures optimization settings that apply to data cell selection, affecting all optimization commands like repair_design and repair_timing. However, this does not apply to clock cell selection in clock_tree_synthesis or repair_clock_nets. ```tcl set_opt_config [-limit_sizing_area float_value] [-limit_sizing_leakage float_value] [-keep_sizing_site boolean_value] [-keep_sizing_vt boolean_value] [-set_early_sizing_cap_ratio float_value] [-set_early_buffer_sizing_cap_ratio float_value] [-disable_buffer_pruning boolean_value] [-sizing_area_limit float_value] (deprecated) [-sizing_leakage_limit float_value] (deprecated) ``` #### Options | Switch Name | Description | |--------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-limit_sizing_area` | Exclude cells from sizing if their area exceeds times the current cell’s area. For example, with 2.0, only cells with an area <= 2X the current cell’s area are considered. The area is determined from LEF, not Liberty. | | `-limit_sizing_leakage` | Exclude cells from sizing if their leakage power exceeds times the current cell’s leakage. For example, with 2.0, only cells with leakage <= 2X the current cell’s leakage are considered. Leakage power is based on the current timing corner. | | `-keep_sizing_site` | Ensure cells retain their original site type during sizing. This prevents short cells from being replaced by tall cells (or vice versa) in mixed-row designs. | | `-keep_sizing_vt` | Preserve the cell’s VT type during sizing, preventing swaps between HVT and LVT cells. This works only if VT layers are defined in the LEF obstruction section. | | `-set_early_sizing_cap_ratio` | Maintain the specified ratio between input pin capacitance and output pin load when performing initial sizing of gates. | | `-set_early_buffer_sizing_cap_ratio` | Maintain the specified ratio between input pin capacitance and output pin load when performing initial sizing of buffers. | | `-disable_buffer_pruning` | Disable buffer pruning to improve hold fixing by not filtering out delay cells or slow buffers. | | `-sizing_area_limit` | Deprecated. Use -limit_sizing_area instead. | | `-sizing_leakage_limit` | Deprecated. Use -limit_sizing_leakage instead. | ### Reporting Optimization Configuration The `report_opt_config` command reports current optimization configuration ```tcl report_opt_config ``` ### Resetting Optimization Configuration The `reset_opt_config` command resets optimization settings applied from `set_opt_config` command. If no options are specified, all optimization configurations are reset. ```tcl reset_opt_config [-limit_sizing_area] [-limit_sizing_leakage] [-keep_sizing_site] [-keep_sizing_vt] [-set_early_sizing_cap_ratio] [-set_early_buffer_sizing_cap_ratio] [-disable_buffer_pruning] [-sizing_area_limit] (deprecated) [-sizing_leakage_limit] (deprecated) ``` #### Options | Switch Name | Description | |--------------------------------------|-----------------------------------------------------------| | `-limit_sizing_area` | Remove area restriction during sizing. | | `-limit_sizing_leakage` | Remove leakage power restriction during sizing. | | `-keep_sizing_site` | Remove site restriction during sizing. | | `-keep_sizing_vt` | Remove VT type restriction during sizing. | | `-set_early_sizing_cap_ratio` | Remove capacitance ratio setting for early sizing. | | `-set_early_buffer_sizing_cap_ratio` | Remove capacitance ratio setting for early buffer sizing. | | `-disable_buffer_pruning` | Restore buffer pruning for optimization. | | `-sizing_area_limit` | Deprecated. Use -limit_sizing_area instead. | | `-sizing_leakage_limit` | Deprecated. Use -limit_sizing_leakage instead. | ### Finding Equivalent Cells The `report_equiv_cells` command finds all functionally equivalent library cells for a given library cell with relative area and leakage power details. ```tcl report_equiv_cells [-match_cell_footprint] [-all] [-vt] lib_cell ``` #### Options | Switch Name | Description | |-------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------| | `-match_cell_footprint` | Limit equivalent cell list to include only cells that match library cell_footprint attribute. | | `-all` | List all equivalent cells, ignoring sizing restrictions and cell_footprint. Cells excluded due to these restrictions are marked with an asterisk. | | `-vt` | List all threshold voltage (VT) equivalent cells such as HVT, RVT, LVT, SLVT. | ### Reporting Buffers The `report_buffers` command reports all usable buffers to include for optimization. Usable buffers are standard cell buffers that are not clock buffers, always on buffers, level shifters, or buffers marked as dont-use. VT type, cell site, cell footprint and leakage are also reported. ```tcl report_buffers [-filtered] ``` #### Options | Switch Name | Description | |---------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-filtered` | Report buffers after filtering based on threshold voltage, cell footprint, drive strength and cell site. Subset of filtered buffers are used for rebuffering. | ### Reporting Delay Estimator Accuracy The `report_delay_estimator_accuracy` command compares a delay estimator’s predictions against the reference STA delay for a candidate library cell at the given instance. It is intended as a developer aid for evaluating estimator accuracy when sizing. ```tcl report_delay_estimator_accuracy -inst instance -lib_cell lib_cell -estimator estimator [-delay_levels level] ``` #### Options | Switch Name | Description | |-----------------|-----------------------------------------------------------------------------------------------------------------------------------------| | `-inst` | Instance whose driver pin is used as the candidate sizing site. Required. | | `-lib_cell` | Liberty cell to evaluate as a replacement for `-inst`. Must resolve to exactly one cell. Required. | | `-estimator` | Delay estimator to evaluate. One of `legacy`, `delay_estimator`, `legacy_mt`, `mt`. Required. | | `-delay_levels` | Number of downstream stages to include in the accuracy comparison: `0`, `1`, or `2`. Default `0`. Not valid for the `legacy` estimator. | ### Optimizing Arithmetic Modules The `replace_arith_modules` command optimizes design performance by intelligently swapping hierarchical arithmetic modules based on realistic timing models. This command analyzes critical timing paths and replaces arithmetic modules with equivalent but architecturally different implementations to improve Quality of Results (QoR) for the specified target. #### Arithmetic Module Types Yosys and OpenROAD support the following arithmetic module variants with different timing/area trade-offs. ALU (Arithmetic Logic Unit) Variants Han-Carlson (default) : Balanced delay and area. Best for general purpose applications. Kogge-Stone : Fastest, largest area. Best for timing-constrained designs. Brent-Kung : Slower, smaller area. Best for area-constrained designs. Sklansky : Moderate delay/area. Best for balanced optimization. MACC (Multiply-Accumulate) Variants Booth (default) : Balanced delay and area. Best for general purpose applications. Base (Han-Carlson) : Fastest, potentially larger area. Best for timing-constrained designs. #### Requirements for Arithmetic Module Swap 1. Hierarchical netlist with arithmetic operators. Yosys can produce such designs by enabling “wrapped operator synthesis”. In OpenROAD-flow-scripts, this can be done as follows: cd OpenROAD-flow-scripts/flow make SYNTH_WRAPPED_OPERATORS=1 This requires a Verilog netlist. DEF netlist alone is not sufficient for hierarchical optimization. 1. Hierarchically linked design. The design needs to be linked to preserve hierarchical boundaries. For example, link_design top -hier read_db -hier ```tcl replace_arith_modules [-path_count num_critical_paths] [-slack_threshold float] [-target setup | hold | power | area] ``` #### Options | Switch Name | Description | |--------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-path_count` | Number of critical paths to analyze to identify candidate arithmetic modules to swap. The default value is `1000`, and the allowed values are integers. | | `-slack_threshold` | Slack threshold in library time units. Use positive values to include paths with small positive slack. The default value is `0.0`, and the allowed values are floats. | | `-target` | Optimization target. Valid types are `setup`, `hold`, `power`, `area`. Default type is `setup`, and the allowed value is string. | #### Arguments Setup ALU: replace all candidate modules with Kogge-Stone (fastest) MACC: replace all candidate modules with Base (fastest) Hold Not available yet Power Not available yet Area Not available yet #### SEE ALSO replace_hier_module #### EXAMPLES Arithmetic modules follow this naming convention per Yosys: ALU_ **_ MACC_ ** Examples: ALU_20_0_25_0_25_unused_CO_X_HAN_CARLSON ALU_20_0_25_0_25_unused_CO_X_KOGGE_STONE ALU_20_0_25_0_25_unused_CO_X_BRENT_KUNG ALU_25_0_20_0_25_unused_CO_X_SKLANSKY \\MACC_14’10001011010100_19_BOOTH \\MACC_14’10001011010100_19_BASE ## Example scripts A typical `resizer` command file (after a design and Liberty libraries have been read) is shown below. ```default read_sdc gcd.sdc set_wire_rc -layer metal2 set_dont_use {CLKBUF_* AOI211_X1 OAI211_X1} buffer_ports repair_design -max_wire_length 100 repair_tie_fanout LOGIC0_X1/Z repair_tie_fanout LOGIC1_X1/Z #clock tree synthesis... repair_timing ``` Note that OpenSTA commands can be used to report timing metrics before or after resizing the design. ```default set_wire_rc -layer metal2 report_checks report_tns report_wns report_checks repair_design report_checks report_tns report_wns ``` ## Regression tests There are a set of regression tests in `./test`. For more information, refer to this [section](../../README.md#regression-tests). Simply run the following script: ```shell ./test/regression ``` ## Limitations ## Using the Python interface to rsz #### WARNING The `Python` interface is currently in development and is subject to change. The `Python` API tries to stay close to the API defined in the `C++` class `Resizer` that is located [here](./include/rsz/Resizer.hh). When initializing a design, a sequence of `Python` commands might look like the following: ```python from openroad import Design, Tech tech = Tech() tech.readLiberty("my_lib.lib") tech.readLef("my_tech.lef") design = Design(tech) design.readDef("my_design.def") resizer = design.getResizer() ``` Here are some common operations on the `Resizer` object: ```python resizer.setMaxUtilization(0.8) resizer.bufferInputs(None, False) resizer.bufferOutputs(None, False) resizer.repairDesign(0.0, 0.0, 0.0, 0.0, False, False) resizer.repairClkNets(0.0) resizer.repairClkInverters() resizer.repairHold(0.0, 0.0, False, 0.2, 10000, -1, False, False) resizer.eliminateDeadLogic(True) resizer.reportLongWires(10, 2) resizer.reportDontUse() resizer.reportDontTouch() ``` There are also some useful `Python` functions located in the [`rsz_aux.py`](./test/rsz_aux.py) file that provide Pythonic keyword-argument wrappers with unit conversions (microns → metres, nanoseconds → seconds, percentages → fractions), but these are not considered part of the *final* API and may be subject to change. ## FAQs Check out [GitHub discussion](https://github.com/The-OpenROAD-Project/OpenROAD/discussions/categories/q-a?discussions_q=category%3AQ%26A+resizer) about this tool. ## License BSD 3-Clause License. See [LICENSE](../../LICENSE) file. # README.html.md # Synthesis OpenROAD’s integrated synthesis tool can elaborate SystemVerilog designs and map them to technology. ## Commands ### Elaborate The `sv_elaborate` command reads SystemVerilog sources, assembles the design hierarchy, and translates the design to a word-level netlist which can be subsequently synthesized using the `synthesize` command. This command accepts [standard slang command-line options](https://sv-lang.com/command-line-ref.html). ```tcl sv_elaborate ``` ### Synthesize The `synthesize` command synthesizes a previously elaborated design, i.e. it implements the design using available standard cells. The mapped gate-level netlist is loaded into OpenROAD’s design database (ODB) for other tools to operate on. ```tcl synthesize [-reduce_name_loss] ``` #### Options | Switch Name | Description | |---------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------| | `-reduce_name_loss` | Disable any optimization steps which would cause mass loss of intermediate signal names. This option trades away quality of results for interpretability. | ## Limitations The integrated synthesis tool does not support mapping to latches, always flattens the design, and loses the names of instantiated macros. ## Authors The original `syn` was developed and contributed by Martin Povišer of Precision Innovations Inc. Design of the intermediate representation used by syn internally derives from the [prjunnamed project](https://prjunnamed.org/): `Copyright (C) Project Unnamed contributors`; distributed under the terms of the BSD-0 license. ## License BSD 3-Clause License. See [LICENSE](../../LICENSE) file. # README.html.md # Partition Manager The partitioning module (`par`) is based on TritonPart, an open-source constraints-driven partitioner. `par` can be used to partition a hypergraph or a gate-level netlist. ## Highlights - State of the art multiple-constraints driven partitioning “multi-tool” - Optimizes cost function based on user requirement - Permissive open-source license - Solves multi-way partitioning with following features: - Multidimensional real-value weights on vertices and hyperedges - Multilevel coarsening and refinement framework - Fixed vertices constraint - Timing-driven partitioning framework - Group constraint: Groups of vertices need to be in same block - Embedding-aware partitioning ## Dependency We use Google OR-Tools as our ILP solver. Our recommendation is to follow the OpenROAD [DependencyInstaller]() for installation of this requirement. Alternatively, you may also install Google OR-Tools following these [instructions](https://developers.google.com/optimization/install). #### WARNING Due to a build issue, TritonPart is not supported for macOS. Stay tuned to this page for updates! ## Main Algorithm An overview of the TritonPart algorithm is shown below. It takes as inputs - Hypergraph $H(V,E)$ in `.hgr` format. - Vertex weight $w_v \in \mathcal{R}_+^m$ - Hyperedge weight $w_e \in \mathcal{R}_+^n$ - Number of blocks $K$. - Imbalance factor $\epsilon$. - User-specified cost function $\phi$. There are five main steps in the main algorithm, mainly 1) constraints-driven coarsening, 2) initial partitioning, 3) refinement, 4) cut-overlay clustering and partitioning (COCP), and 5) V-cycle refinement. The steps for the timing-aware algorithm may be found in the next [section](). 1. Constraints-Driven Coarsening The first step involves multilevel coarsening. Specifically, at each level, clusters of vertices are identified, and the merged and represented as a single vertex in the resulting coarser hypergraph. In this algorithm, the First-Choice scheme is used, which traverses the vertices in the hypergraph according to a given ordering and merges pairs of vertices with high connectivity. The connectivity between a pair of vertices $(u,v)$ is measured as follows: $$ r(u, v) = \sum_{e\in \{I(v)\cap I(u)\}} \frac{\langle \alpha, w_e\rangle}{|e|-1} $$ To efficiently manage multiple constraints, the following enhancements are made to the coarsening scheme above: - **Fixed Vertex Constraint**: Fixed vertices that belong to the same partitioning block are merged into a single vertex. - **Grouping Constraint**: Vertices that belong to the same group are merged into a single vertex. - **Embedding Constraint**: The embedding information is incorporated into the heavy-edge rating function. The new connectivity is updated as follows: $$ \hat{r}(u, v) = r(u, v) + \rho\frac{1}{||X_u - X_v||_2} $$ where $\rho$ is a normalization factor set to the average distance between two vertex embeddings. When vertices $v_1, ... , v_t$ are merged into a single vertex $v_{coarse}$, the corresponding vertex embedding $X_{v_{coarse}}$ is defined as the *center of gravity* of $t$ vertices: $$ X_{v_{coarse}} = \sum_{j=1}^{t} \frac{||w_{v_j}||}{M} X_{v_j},\ where\ M= \sum_{j=1}^t ||w_{v_j}|| $$ - **Community Guidance**: Only vertices within the same community are considered for merging. - **Tie-breaking mechanism**: If multiple neighbor pairs have the same rating score, combine the lexicographically first unmatched vertex to break ties. 1. Initial Partitioning After completing the coarsening process, an initial partitioning solution for the coarsest hypergraph $H_c$ is derived. Two sub-steps are involved in this: the best partitioning solution from random and VILE partitioning is chosen from $\eta = 50$ runs as a warm-start to the ILP-based partitioner. The optimization is based on only the cut size rather than the cost function $\phi$ to keep the runtime reasonable. 1. Refinement After a feasible solution $H_{c_\xi}$ is obtained by initial partitioning, uncoarsening and move-based refinement is performed to improve the partitioning solution. Three refinement heuristics are applied in sequence: - **$K$-way pairwise FM (PM)**: This addresses multi-way partitioning as concurrent bi-partitioning problems in a restricted version of K-way Fiduccia–Mattheyses (FM) algorithm. First, $\lfloor K/2\rfloor $ pairs of blocks are obtained, with refinement-specific vertex movements restricted to associated paired blocks. Next, two-way FM is concurrently performed on all the block pairs. finally, a new configuration of block pairs is computed at the end of the PM. - **Direct $K$-way FM**: Using $K$ priority queues, for each block $V_i$, establish a priority queue that stores the vertices that can be potentially moved from the current block to block $V_i$. This queue is ordered according to the gain of the vertices. Gain is defined as the reduction in cost function from the movement of the vertex from the current block to $V_i$. Next, after a vertex move, each priority queue is updated independently, thus enabling parallel updates via multi-threading. Next, early-stop is implemented by limiting the maximum number of vertices moved to 100 per pass. Finally, the *corking effect* is mitigated by traversing the priority queue belonging to the vertex with the highest gain and identifying a feasible vertex move. - **Greedy Hyperedge Refinement (HER)**: First, randomly visit all hyperedges. For each hyperedge $e$ that crosses the partition boundary, determine whether a subset of vertices in $e$ can be moved without violating the multi-dimensional balance constraints. The objective is to make $e$ entirely constrained in a block. 1. Cut-Overlay Clustering and Partitioning (COCP) Cut-overlay Clustering and Partitioning (COCP) is a mechanism to combine multiple good-quality partitioning solutions to generate an improved solution. To begin, the sets of hyperedges cut in the $\theta$ candidate solutions are denoted as $E_1,..., E_\theta \subset E$. First, $\cup_{i=1}^\theta E_i$ is removed from the hypergraph $H(V, E)$, resulting in a number of connected components. Next, all vertices within each connected component are merged to form a coarser hypergraph $H_{overlay}$. If the number of vertices in $H_{overlay}$ is less than $thr_{ilp}$, ILP-based partitioning is performed. If not, a single round of constraints-driven coarsening is conducted to further reduce the size of $H_{overlay}$ and generate a coarser hypergraph $H_{overlay}^{'}$. Finally, multilevel refinement is performed to further improve the partitioning solution at each level of the hierarchy and return the improved solution $S^{'}$. 1. V-Cycle Refinement Cut-overlay clustering and partitioning produces a high-quality partitioning solution $S^{'}$. To improve it, there are three phases similar to *hMETIS*, namely multilevel coarsening, ILP-based partitioning, and refinement. Firstly, in multilevel partitioning, $S^{'}$ is used as a community guidance for the constraints-driven coarsening. Only vertices within the same block are permitted to be merged to ensure that the current solution $S^{'}$ is preserved in the coarsest hypergraph $H_{c_\xi}$. In the ILP-based partitioning phase, if the number of vertices in $H_{c_\xi}$ does not exceed $thr_{ilp}$, run ILP-based partitioning to improve $S^{'}$. Otherwise, continue with $S^{'}$ in successive iterations of these two steps (default set to 2). The refinement phase is conducted as per step 3. ![](main/src/par/doc/algo.webp)
TritonPart algorithm at a glance
## Timing Aware Algorithm `par` can also be used as a timing-aware partitioning framework. A slack propagation methodology is used that optimizes cuts for both timing-critical and timing-noncritical paths. 1. Extraction of Timing Paths and Slack Information First, the top $P$ timing-critical paths and the slack information of each hyperedge using the wireload model (WLM) is obtained from *OpenSTA*. The timing cost of each path is then calculated: $$ t_p = (1- \frac{slack_p - \Delta}{clock\_period})^\mu $$ where a fixed extra delay $\Delta$ is introduced for timing guardband, and $\mu$ (default 2) is the exponent. The snaking factor of a path $SF(p)$ is defined as the maximum number of block reentries along the path $p$. The timing cost of a hyperedge is computed using the timing weight corresponding to hyperedge slack $slack_e$ and the accumulated timing cost of all paths traversing the hyperedge. $$ t_e = (1- \frac{slack_e -\Delta}{clock\_period})^\mu + \sum_{\{p|e\in p\}}t_p $$ 1. Timing-aware Coarsening The timing-aware feature is achieved by adding a timing cost of hyperedge $t_e$ to the connectivity score earlier mentioned. If vertices $(u,v)$ are associated with multiple critical paths, then they are more likely to be merged. This is reflected in the update score function: $$ r_t(u,v) = \hat{r}(u,v) + \sum_{e\in\{I(v) \cap I(u)\}} \frac{\beta t_e}{|e| - 1} $$ 1. Timing-aware Refinement Timing-aware refinement is based on a similar cost function as the main algorithm. Instead, an additional slack propagation step is performed at the end of each PM/FM/HER pass. ## Commands #### NOTE - Parameters in square brackets `[-param param]` are optional. - Parameters without square brackets `-param2 param2` are required. ### Partition Hypergraph Netlist This command performs hypergraph netlist partitioning. ```tcl triton_part_hypergraph -hypergraph_file hypergraph_file -num_parts num_parts -balance_constraint balance_constraint [-base_balance base_balance] [-scale_factor scale_factor] [-seed seed] [-vertex_dimension vertex_dimension] [-hyperedge_dimension hyperedge_dimension] [-placement_dimension placement_dimension] [-fixed_file fixed_file] [-community_file community_file] [-group_file group_file] [-placement_file placement_file] [-e_wt_factors e_wt_factors] [-v_wt_factors ] [-placement_wt_factors ] [-thr_coarsen_hyperedge_size_skip thr_coarsen_hyperedge_size_skip] [-thr_coarsen_vertices thr_coarsen_vertices] [-thr_coarsen_hyperedges thr_coarsen_hyperedges] [-coarsening_ratio coarsening_ratio] [-max_coarsen_iters max_coarsen_iters] [-adj_diff_ratio adj_diff_ratio] [-min_num_vertices_each_part min_num_vertices_each_part] [-num_initial_solutions num_initial_solutions] [-num_best_initial_solutions num_best_initial_solutions] [-refiner_iters refiner_iters] [-max_moves max_moves] [-early_stop_ratio early_stop_ratio] [-total_corking_passes total_corking_passes] [-v_cycle_flag v_cycle_flag ] [-max_num_vcycle max_num_vcycle] [-num_coarsen_solutions num_coarsen_solutions] [-num_vertices_threshold_ilp num_vertices_threshold_ilp] [-global_net_threshold global_net_threshold] ``` #### Options | Switch Name | Description | |------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-num_parts` | Number of partitions. The default value is `2`, and the allowed values are integers `[0, MAX_INT]`. | | `-balance_constraint` | Allowed imbalance between blocks. The default value is `1.0`, and the allowed values are floats. | | `-base_balance` | Tcl list of baseline imbalance between partitions. The default value is `{1.0}`, and the allowed values are floats that sum up to `1.0`. | | `-scale_factor` | KIV. The default value is `{1.0}`, and the allowed values are floats that sum up to `1.0`. | | `-seed` | Random seed. The default value is `0`, and the allowed values are integers `[-MAX_INT, MAX_INT]`. | | `-vertex_dimension` | Number of vertices in the hypergraph. The default value is `1`, and the allowed values are integers `[0, MAX_INT]`. | | `-hyperedge_dimension` | Number of hyperedges in hypergraph. The default value is `1`, and the allowed values are integers `[0, MAX_INT]`. | | `-placement_dimension` | Number of dimensions for canvas if placement information is provided. The default value is `0`, and the allowed values are integers `[0, MAX_INT]`. | | `-hypergraph_file` | Path to hypergraph file. | | `-fixed_file` | Path to fixed vertices constraint file. | | `-community_file` | Path to `community` attributes file to guide the partitioning process. | | `-group_file` | Path to `stay together` attributes file. | | `-placement_file` | Placement information file, each line corresponds to a group fixed vertices, community, and placement attributes following the [hMETIS](https://course.ece.cmu.edu/~ee760/760docs/hMetisManual.pdf) format. | | `-e_wt_factors` | Hyperedge weight factor. | | `-v_wt_factors` | Vertex weight factors. | | `-placement_wt_factors` | Placement weight factors. | | `-thr_coarsen_hyperedge_size_skip` | Threshold for ignoring large hyperedge (default 200, integer). | | `-thr_coarsen_vertices` | Number of vertices of coarsest hypergraph (default 10, integer). | | `-thr_coarsen_hyperedges` | Number of vertices of coarsest hypergraph (default 50, integer). | | `-coarsening_ratio` | Coarsening ratio of two adjacent hypergraphs (default 1.6, float). | | `-max_coarsen_iters` | Number of iterations (default 30, integer). | | `-adj_diff_ratio` | Minimum difference of two adjacent hypergraphs (default 0.0001, float). | | `-min_num_vertices_each_part` | Minimum number of vertices in each partition (default 4, integer). | | `-num_initial_solutions` | Number of initial solutions (default 50, integer). | | `-num_best_initial_solutions` | Number of top initial solutions to filter out (default 10, integer). | | `-refiner_iters` | Refinement iterations (default 10, integer). | | `-max_moves` | The allowed moves for each Fiduccia-Mattheyes (FM) algorithm pass or greedy refinement (default 60, integer). | | `-early_stop_ratio` | Describes the ratio $e$ where if the $n_{moved vertices} > n_{vertices} * e$, the tool exits the current FM pass. The intention behind this is that most of the gains are achieved by the first few FM moves. (default 0.5, float). | | `-total_corking_passes` | Maximum level of traversing the buckets to solve the “corking effect” (default 25, integer). | | `-v_cycle_flag` | Disables v-cycle is used to refine partitions (default true, bool). | | `-max_num_vcycle` | Maximum number of `vcycles` (default 1, integer). | | `-num_coarsen_solutions` | Number of coarsening solutions with different randoms seed (default 3, integer). | | `-num_vertices_threshold_ilp` | Describes threshold $t$, the number of vertices used for integer linear programming (ILP) partitioning. if $n_{vertices} > t$, do not use ILP-based partitioning.(default 50, integer). | | `-global_net_threshold` | If the net is larger than this, it will be ignored by TritonPart (default 1000, integer). | ### Evaluate Hypergraph Partition This command evaluates hypergraph partition. ```tcl evaluate_hypergraph_solution -num_parts num_parts -balance_constraint balance_constraint -hypergraph_file hypergraph_file -solution_file solution_file [-base_balance base_balance] [-scale_factor scale_factor] [-vertex_dimension vertex_dimension] [-hyperedge_dimension hyperedge_dimension] [-fixed_file fixed_file] [-group_file group_file] [-e_wt_factors e_wt_factors] [-v_wt_factors v_wt_factors] ``` #### Options | Switch Name | Description | |------------------------|------------------------------------------------------------------------------------------------------------------------------------------| | `-num_parts` | Number of partitions. The default value is `2`, and the allowed values are integers `[0, MAX_INT]`. | | `-balance_constraint` | Allowed imbalance between blocks. The default value is `1.0`, and the allowed values are floats. | | `-vertex_dimension` | Number of vertices in the hypergraph. The default value is `1`, and the allowed values are integers `[0, MAX_INT]`. | | `-hyperedge_dimension` | Number of hyperedges in hypergraph. The default value is `1`, and the allowed values are integers `[0, MAX_INT]`. | | `-hypergraph_file` | Path to hypergraph file. | | `-solution_file` | Path to solution file. | | `-base_balance` | Tcl list of baseline imbalance between partitions. The default value is `{1.0}`, and the allowed values are floats that sum up to `1.0`. | | `-scale_factor` | KIV. The default value is `{1.0}`, and the allowed values are floats that sum up to `1.0`. | | `-fixed_file` | Path to fixed vertices constraint file. | | `-group_file` | Path to `stay together` attributes file. | | `-e_wt_factors` | Hyperedge weight factor. | | `-v_wt_factors` | Vertex weight factor. | ### Partition Netlist This command partitions the design netlist. Note that design must be loaded in memory. ```tcl triton_part_design [-num_parts num_parts] [-balance_constraint balance_constraint] [-base_balance base_balance] [-scale_factor scale_factor] [-seed seed] [-timing_aware_flag timing_aware_flag] [-top_n top_n] [-placement_flag placement_flag] [-fence_flag fence_flag] [-fence_lx fence_lx] [-fence_ly fence_ly] [-fence_ux fence_ux] [-fence_uy fence_uy] [-fixed_file fixed_file] [-community_file community_file] [-group_file group_file] [-solution_file solution_file] [-net_timing_factor net_timing_factor] [-path_timing_factor path_timing_factor] [-path_snaking_factor path_snaking_factor] [-timing_exp_factor timing_exp_factor] [-extra_delay extra_delay] [-guardband_flag guardband_flag] [-e_wt_factors e_wt_factors] [-v_wt_factors v_wt_factors] [-placement_wt_factors placement_wt_factors] [-thr_coarsen_hyperedge_size_skip thr_coarsen_hyperedge_size_skip] [-thr_coarsen_vertices thr_coarsen_vertices] [-thr_coarsen_hyperedges thr_coarsen_hyperedges] [-coarsening_ratio coarsening_ratio] [-max_coarsen_iters max_coarsen_iters] [-adj_diff_ratio adj_diff_ratio] [-min_num_vertices_each_part min_num_vertices_each_part] [-num_initial_solutions num_initial_solutions] [-num_best_initial_solutions num_best_initial_solutions] [-refiner_iters refiner_iters] [-max_moves max_moves] [-early_stop_ratio early_stop_ratio] [-total_corking_passes total_corking_passes] [-v_cycle_flag v_cycle_flag ] [-max_num_vcycle max_num_vcycle] [-num_coarsen_solutions num_coarsen_solutions] [-num_vertices_threshold_ilp num_vertices_threshold_ilp] [-global_net_threshold global_net_threshold] ``` #### Options | Switch Name | Description | |------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-num_parts` | Number of partitions. The default value is `2`, and the allowed values are integers `[0, MAX_INT]`. | | `-balance_constraint` | Allowed imbalance between blocks. The default value is `1.0`, and the allowed values are floats. | | `-base_balance` | Tcl list of baseline imbalance between partitions. The default value is `{1.0}`, and the allowed values are floats that sum up to `1.0`. | | `-scale_factor` | KIV. The default value is `{1.0}`, and the allowed values are floats that sum up to `1.0`. | | `-seed` | Random seed. The default value is `1`, and the allowed values are integers `[-MAX_INT, MAX_INT]`. | | `-timing_aware_flag` | Enable timing-driven mode. The default value is `true`, and the allowed values are booleans. | | `-top_n` | Extract the top n critical timing paths. The default value is `1000`, and the allowed values are integers `[0, MAX_INT`. | | `-placement_flag` | Enable placement driven partitioning. The default value is `false`, and the allowed values are booleans. | | `-fence_flag ` | Consider fences in the partitioning. The default value is `false`, and the allowed values are booleans. | | `-fence_lx ` | Fence lower left x in microns. The default value is `0.0`, and the allowed values are floats. | | `-fence_ly ` | Fence lower left y in microns. The default value is `0.0`, and the allowed values are floats. | | `-fence_ux ` | Fence upper right x in microns. The default value is `0.0`, and the allowed values are floats. | | `-fence_uy ` | Fence upper right y in microns. The default value is `0.0`, and the allowed values are floats. | | `-fixed_file` | Path to fixed vertices constraint file | | `-community_file` | Path to `community` attributes file to guide the partitioning process. | | `-group_file` | Path to `stay together` attributes file. | | `-solution_file` | Path to solution file. | | `-net_timing_factor` | Hyperedge timing weight factor (default 1.0, float). | | `-path_timing_factor` | Cutting critical timing path weight factor (default 1.0, float). | | `-path_snaking_factor` | Snaking a critical path weight factor (default 1.0, float). | | `-timing_exp_factor` | Timing exponential factor for normalized slack (default 1.0, float). | | `-extra_delay` | Extra delay introduced by a cut (default 1e-9, float). | | `-guardband_flag` | Enable timing guardband option (default false, bool). | | `-e_wt_factors` | Hyperedge weight factor. | | `-v_wt_factors` | Vertex weight factor. | | `-placement_wt_factors` | Placement weight factor. | | `-thr_coarsen_hyperedge_size_skip` | Threshold for ignoring large hyperedge. The default value is `1000`, and the allowed values are integers `[0, MAX_INT]`. | | `-thr_coarsen_vertices` | Number of vertices of coarsest hypergraph. The default value is `10`, and the allowed values are integers `[0, MAX_INT]`. | | `-thr_coarsen_hyperedges` | Number of vertices of the coarsest hypergraph. The default value is `50`, and the allowed values are integers `[0, MAX_INT]`. | | `-coarsening_ratio` | Coarsening ratio of two adjacent hypergraphs. The default value is `1.5`, and the allowed values are floats. | | `-max_coarsen_iters` | Number of iterations. The default value is `30`, and the allowed values are integers `[0, MAX_INT]`. | | `-adj_diff_ratio` | Minimum ratio difference of two adjacent hypergraphs. The default value is `0.0001`, and the allowed values are floats. | | `-min_num_vertices_each_part` | Minimum number of vertices in each partition. The default value is `4`, and the allowed values are integers `[0, MAX_INT]`. | | `-num_initial_solutions` | Number of initial solutions. The default value is `100`, and the allowed values are integers `[0, MAX_INT]`. | | `-num_best_initial_solutions` | Number of top initial solutions to filter out. The default value is `10`, and the allowed values are integers `[0, MAX_INT]`. | | `-refiner_iters` | Refinement iterations. The default value is `10`, and the allowed values are integers `[0, MAX_INT]`. | | `-max_moves` | The allowed moves for each Fiduccia-Mattheyes (FM) algorithm pass or greedy refinement. The default value is `100`, and the allowed values are integers `[0, MAX_INT]`. | | `-early_stop_ratio` | Describes the ratio $e$ where if the $n_{moved vertices} > n_{vertices} * e$, the tool exists the current FM pass. The intention behind this is that most of the gains are achieved by the first few FM moves. The default value is `0.5`, and the allowed values are floats. | | `-total_corking_passes` | Maximum level of traversing the buckets to solve the “corking effect”. The default value is `25`, and the allowed values are integers `[0, MAX_INT]`. | | `-v_cycle_flag` | Disables v-cycle is used to refine partitions. The default value is `true`, and the allowed values are booleans. | | `-max_num_vcycle` | Maximum number of vcycles. The default value is `1`, and the allowed values are integers `[0, MAX_INT]`. | | `-num_coarsen_solutions` | Number of coarsening solutions with different randoms seed. The default value is `4`, and the allowed values are integers `[0, MAX_INT]`. | | `-num_vertices_threshold_ilp` | Describes threshold $t$, the number of vertices used for integer linear programming (ILP) partitioning. if $n_{vertices} > t$, do not use ILP-based partitioning. The default value is `50`, and the allowed values are integers `[0, MAX_INT]`. | | `-global_net_threshold` | If the net is larger than this, it will be ignored by TritonPart. The default value is `1000`, and the allowed values are integers `[0, MAX_INT]`. | ### Evaluate Netlist Partition This command evaluates partition design solution. ```tcl evaluate_part_design_solution [-num_parts num_parts] [-balance_constraint balance_constraint] [-base_balance base_balance] [-scale_factor scale_factor] [-timing_aware_flag timing_aware_flag] [-top_n top_n] [-fence_flag fence_flag] [-fence_lx fence_lx] [-fence_ly fence_ly] [-fence_ux fence_ux] [-fence_uy fence_uy] [-fixed_file fixed_file] [-community_file community_file] [-group_file group_file] [-hypergraph_file hypergraph_file] [-hypergraph_int_weight_file hypergraph_int_weight_file] [-solution_file solution_file] [-net_timing_factor net_timing_factor] [-path_timing_factor path_timing_factor] [-path_snaking_factor path_snaking_factor] [-timing_exp_factor timing_exp_factor] [-extra_delay extra_delay] [-guardband_flag guardband_flag] [-e_wt_factors e_wt_factors] [-v_wt_factors v_wt_factors] ``` #### Options | Switch Name | Description | |-------------------------------|------------------------------------------------------------------------------------------------------------------------------------------| | `-num_parts` | Number of partitions. The default value is `2`, and the allowed values are integers `[0, MAX_INT]`. | | `-balance_constraint` | Allowed imbalance between blocks. The default value is `1.0`, and the allowed values are floats. | | `-base_balance` | Tcl list of baseline imbalance between partitions. The default value is `{1.0}`, and the allowed values are floats that sum up to `1.0`. | | `-scale_factor` | KIV. The default value is `{1.0}`, and the allowed values are floats that sum up to `1.0`. | | `-timing_aware_flag` | Enable timing-driven mode. The default value is `true`, and the allowed values are booleans. | | `-top_n` | Extract the top n critical timing paths. The default value is `1000`, and the allowed values are integers `[0, MAX_INT]`. | | `-fence_flag ` | Consider fences in the partitioning. The default value is `false`, and the allowed values are booleans. | | `-fence_lx ` | Fence lower left x in microns. The default value is `0.0`, and the allowed values are floats. | | `-fence_ly ` | Fence lower left y in microns. The default value is `0.0`, and the allowed values are floats. | | `-fence_ux ` | Fence upper right x in microns. The default value is `0.0`, and the allowed values are floats. | | `-fence_uy ` | Fence upper right y in microns. The default value is `0.0`, and the allowed values are floats. | | `-fixed_file` | Path to fixed vertices constraint file. | | `-community_file` | Path to `community` attributes file to guide the partitioning process. | | `-group_file` | Path to `stay together` attributes file. | | `-hypergraph_file` | Path to hypergraph file. | | `-hypergraph_int_weight_file` | Path to `hMETIS` format integer weight file. | | `-solution_file` | Path to solution file. | | `-net_timing_factor` | Hyperedge timing weight factor. The default value is `1.0`, and the allowed values are floats. | | `-path_timing_factor` | Cutting critical timing path weight factor. The default value is `1.0`, and the allowed values are floats. | | `-path_snaking_factor` | Snaking a critical path weight factor. The default value is `1.0`, and the allowed values are floats. | | `-timing_exp_factor` | Timing exponential factor for normalized slack. The default value is `1.0`, and the allowed values are floats. | | `-extra_delay` | Extra delay introduced by a cut. The default value is `1e-9`, and the allowed values are floats. | | `-guardband_flag` | Enable timing guardband option. The default value is 1`false`, and the allowed values are booleans. | | `-e_wt_factors` | Hyperedge weight factors. | | `-v_wt_factors` | Vertex weight factors. | ### Write Partition to Verilog This command writes the partition result to verilog. ```tcl write_partition_verilog [-port_prefix prefix] [-module_suffix suffix] [-partitioning_id part_id] [file] ``` #### Options | Switch Name | Description | |------------------|-----------------------------------------| | `-port_prefix` | Port name prefix. | | `-module_suffix` | Module name suffix. | | `file` | Filename to write partition verilog to. | ### Read the Partition file This command reads the partition file into design. ```tcl read_partitioning -read_file name [-instance_map_file file_path] ``` | Switch Name | Description | |----------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------| | `-read_file` | Read partitioning file (usually with the extension `.part`). The file format must match the same format as the output of `write_partition_verilog`. | | `-instance_map_file` | Instance mapping file. | ## Example Scripts ## How to partition a hypergraph in the way you would using hMETIS (min-cut partitioning) ```default triton_part_hypergraph -hypergraph_file des90.hgr -num_parts 5 -balance_constraint 2 -seed 2 ``` You can also check the provided example [here](./examples/min-cut-partitioning/run_openroad.tcl). ## How to perform the embedding-aware partitioning ```default set num_parts 2 set balance_constraint 2 set seed 0 set design sparcT1_chip2 set hypergraph_file "${design}.hgr" set placement_file "${design}.hgr.ubfactor.2.numparts.2.embedding.dat" set solution_file "${design}.hgr.part.${num_parts}" triton_part_hypergraph -hypergraph_file $hypergraph_file -num_parts $num_parts \ -balance_constraint $balance_constraint \ -seed $seed \ -placement_file ${placement_file} -placement_wt_factors { 0.00005 0.00005 } \ -placement_dimension 2 ``` You can find the provided example [here](./examples/embedding-aware-partitioning/run_placement_aware_flow.tcl). ## How to partition a netlist ```default # set technology information set ALL_LEFS “list_of_lefs” set ALL_LIBS “list_of_libs” # set design information set design “design_name” set top_design “top_design” set netlist “netlist.v” set sdc “timing.sdc” foreach lef_file ${ALL_LEFS} { read_lef $lef_file } foreach lib_file ${ALL_LIBS} { read_lib $lib_file } read_verilog $netlist link_design $top_design read_sdc $sdc set num_parts 5 set balance_constraint 2 set seed 0 set top_n 100000 # set the extra_delay_cut to 20% of the clock period # the extra_delay_cut is introduced for each cut hyperedge set extra_delay_cut 9.2e-10 set timing_aware_flag true set timing_guardband true set part_design_solution_file "${design}_part_design.hgr.part.${num_parts}" ############################################################################################## ## TritonPart with slack progagation ############################################################################################## puts "Start TritonPart with slack propagation" # call triton_part to partition the netlist triton_part_design -num_parts $num_parts -balance_constraint $balance_constraint \ -seed $seed -top_n $top_n \ -timing_aware_flag $timing_aware_flag -extra_delay $extra_delay_cut \ -guardband_flag $timing_guardband \ -solution_file $part_design_solution_file ``` You can find the provided example [here](./examples/timing-aware-partitioning/run_timing_aware_flow.tcl). ## Regression tests There are a set of regression tests in `./test`. For more information, refer to this [section](../../README.md#regression-tests). Simply run the following script: ```shell ./test/regression ``` # ArtNet Spec File Generation Flow ArtNet is the hierarchical clustering-based artificial netlist generator with the capability to support heterogeneous designs with macros. ArtNet enables netlist generation from (1) user-specified parameters, and (2) from parameters of a given target design. | ![image](main/src/par/doc/ArtNet_usecases.png) | |--------------------------------------------------| | *Use Cases of ArtNet* | ## Netlist Parameters | ![image](main/src/par/doc/ArtNet_ParamTable.png) | |----------------------------------------------------| | *Description of Netlist Parameters* | What is Rent’s exponent? - Rent’s Rule [(*link*)](https://ieeexplore.ieee.org/document/1671752) - A heuristic used to describe the relationship between the number of external pins (connections) and the size of a circuit (usually in terms of the number of gates). It provides a simple way to estimate how the complexity of a circuit grows as the number of components increases. - **Region1** refers to the portion of the circuit where Rent’s rule is typically valid. In this region, the relationship between internal and external connections follows the power-law form described by Rent’s rule. - In **Region 2**, the structure of the circuit may deviate from Rent¡¯s rule and the simple power-law relationship no longer holds as closely. | ![image](main/src/par/doc/RentsRule.png) | |:–:| | *Region I and II in #Terminals-#Gate Plot* | ## Spec File Description - The spec file, which is the input file for ArtNet, is structured as follows. | ![image](main/src/par/doc/ArtNet_specFile.png) | |:–:| | *Example of SpecFile* | - **LIBRARY**: Defines the master names of all standard cells and macros used in the entire circuit. - **MODULE**: Specifies a submodule within the logical hierarchy under the top module. Multiple types of submodules can be defined; the example includes a single submodule named *sub_module*. - **LIBRARIES**: Lists the masters and MODULEs used within the circuit or submodule. MODULEs can also include LIBRARIES with other MODULE definitions, representing multi-level hierarchy… - **DISTRIBUTION**: Indicates the quantity of each master or MODULE defined in LIBRARIES. - For example, in the top module, if LIBRARIES includes *lib* and *sub_module*, the first DISTRIBUTION line refers to the number of each cell in LIBRARY *lib* (e.g., 1200 DFFHQx4, 3000 INVx2, etc.). - The second DISTRIBUTION line shows that 10 instances of *sub_module* are used under the top module. - **SIZE**: - The first SIZE defines the physical region size of Region 1 (recommended: 0.25x ~ 0.50x of total number of instances). - The second SIZE indicates the total number of instances in the MODULE or CIRCUIT (recommended: 100 ~ 10^9). - **p/q**: Represent the interconnect complexity. - p: Rent¡¯s exponent (recommended: 0.4 ~ 0.7) - q: the standard deviation of Rent¡¯s exponent. (recommended: 0.01 ~ 0.2) - **I/O**: The number of primary inputs and outputs for the MODULE or CIRCUIT. (recommended: 10 ~ 1000) ### Parameter Extraction Command This command performs ArtNet spec file generation. ```tcl write_artnet_spec [ -out_file file ] ``` #### Options | Switch Name | Description | |---------------|---------------------------| | `-out_file` | Name of output spec file. | ## References 1. Bustany, I., Kahng, A. B., Koutis, I., Pramanik, B., & Wang, Z. (2023). K-SpecPart: A Supervised Spectral Framework for Multi-Way Hypergraph Partitioning Solution Improvement. arXiv preprint arXiv:2305.06167. [(.pdf)](https://arxiv.org/pdf/2305.06167) 2. Bustany, I., Gasparyan, G., Kahng, A. B., Koutis, I., Pramanik, B., & Wang, Z. (2023). “An Open-Source Constraints-Driven General Partitioning Multi-Tool for VLSI Physical Design”, Proc. ACM/IEEE International Conference of Computer-Aided Design 2023,[(.pdf)](https://vlsicad.ucsd.edu/Publications/Conferences/401/c401.pdf). 3. Landman, B. S., & Russo, R. L. (1971). “On a Pin Versus Block Relationship for Partitions of Logic Graphs”, IEEE Trans. on Computers, 20(12) pp.1469-1479,[(*link*)](https://ieeexplore.ieee.org/document/1671752). ## License BSD 3-Clause License. See [LICENSE](../../LICENSE) file. # README.html.md # Web Viewer The web viewer module in OpenROAD (`web`) provides a browser-based interface for exploring chip layouts and performing design analysis. It renders the design as PNG tiles served over WebSocket, enabling smooth zoom and pan of large designs without a native GUI. ## Commands #### NOTE - Parameters in square brackets `[-param param]` are optional. - Parameters without square brackets `-param2 param2` are required. ### Web Server Start the web viewer server. This opens a WebSocket server and launches the viewer in the default browser. ```tcl web_server [-port port] -dir dir ``` #### Options | Switch Name | Description | |---------------|------------------------------------------------------------------------------------------------| | `-port` | TCP port to listen on. Default: `8080`. | | `-dir` | Path to the document root directory containing the web assets (`index.html`, `*.js`, `*.css`). | ### Save Image Save the layout to a PNG file. By default, the command uses the GUI (Qt) renderer. Pass `-web` to use the web tile renderer instead, which runs entirely server-side without a display and is suitable for headless CI. ```tcl save_image [-web] [-area {x0 y0 x1 y1}] [-width width] [-resolution microns_per_pixel] [-display_option option] path ``` #### Options | Switch Name | Description | |-------------------|------------------------------------------------------------------------------------------------------------| | `-web` | Use the web tile renderer instead of the GUI renderer. Does not require a display or a running web server. | | `-area` | Bounding box in microns `{x0 y0 x1 y1}`. Default: die area (with 5% margin in `-web` mode). | | `-width` | Output image width in pixels. Cannot be used with `-resolution`. | | `-resolution` | Resolution in microns per pixel. Minimum: 1 DBU per pixel. Cannot be used with `-width`. | | `-display_option` | Repeatable visibility overrides as `{control value}` pairs. See [Display option keys]() below. | | `path` | Output PNG file path. | When using `-web`, if neither `-width` nor `-resolution` is specified, the image defaults to 1024 pixels wide. The maximum image dimension is 16384 pixels; larger requests are clamped automatically. #### Display option keys (web mode) Display options control which elements are rendered when using `-web`. Each option is a `{key value}` pair where the key matches a visibility field and the value is `true` or `false`. | Key | Default | Description | |----------------|-----------|----------------------------| | `stdcells` | true | Standard cells | | `macros` | true | Macros | | `routing` | true | Signal routing | | `special_nets` | true | Power/ground straps | | `pins` | true | Instance pins | | `pin_markers` | true | IO pin direction markers | | `blockages` | true | Blockages | | `net_signal` | true | Signal nets | | `net_power` | true | Power nets | | `net_clock` | true | Clock nets | | `rows` | false | Row outlines | | `tracks_pref` | false | Preferred-direction tracks | #### Examples ```tcl # Save using the GUI renderer (default) save_image layout.png # Save using the web renderer (headless) save_image -web layout.png # Save at 1024px wide with the web renderer save_image -web -width 1024 layout.png # Save at 0.1 um per pixel save_image -web -resolution 0.1 layout.png # Save a specific region (in microns) save_image -web -area {0 0 100 100} -width 2048 region.png # Hide routing and power nets save_image -web -display_option {routing false} \ -display_option {net_power false} \ layout.png ``` ### Save Report Generate a self-contained HTML timing report. The report uses the same JavaScript frontend as the live web viewer but serves all data from a cache embedded in the HTML file. No running server is required to view the report. ```tcl web_save_report [-setup_paths count] [-hold_paths count] path ``` #### Options | Switch Name | Description | |----------------|------------------------------------------------------------------| | `-setup_paths` | Maximum number of setup timing paths to include. Default: `100`. | | `-hold_paths` | Maximum number of hold timing paths to include. Default: `100`. | | `path` | Output HTML file path. | The report includes: - **Layout view** with pre-rendered tiles at a fixed zoom level. Layer visibility can be toggled using the same display controls as the live viewer. Zoom is disabled; pan is allowed. - **Timing table** with setup and hold paths. Clicking a path highlights it on the layout via a pre-rendered overlay image. - **Slack histogram** with setup/hold tabs. - **Display controls**, hierarchy browser, clock tree, and other panels from the live viewer (features that require server interaction show empty states). The report requires an internet connection to load Leaflet and GoldenLayout CSS/JS from CDN. #### Examples ```tcl # Generate a report with default settings web_save_report timing.html # Include more paths web_save_report -setup_paths 200 -hold_paths 200 timing.html ``` ## Features - **Tile-based rendering** — The server renders 256x256 PNG tiles on demand, supporting smooth zoom and pan of designs with millions of instances. - **Object inspection** — Click on instances, nets, pins, or other objects to view their properties in an inspector panel. Hover highlights are rendered server-side in tiles. - **Timing analysis** — View timing paths with slack, delay, and arrival time metrics. Highlight critical paths on the layout. Slack histogram charts with filtering by path group and clock domain. - **Clock tree visualization** — Browse clock tree hierarchy, highlight clock paths, and view per-level statistics. - **Hierarchy browser** — Navigate the module tree with instance counts and area statistics. Toggle visibility and assign colors per module using a 31-color palette. - **Display controls** — Toggle visibility of cell types (stdcells, macros, pads), net types (signal, power, clock), and shapes (routing, pins, blockages, rows, tracks). - **Focus nets** — Isolate specific nets for inspection, dimming all other routing. - **Tcl console** — Execute Tcl commands interactively from the browser. ## Architecture The module has two parts: - **C++ server** (`src/web.cpp`, `src/request_handler.cpp`, `src/tile_generator.cpp`) — A Boost Beast WebSocket server that handles tile rendering, object selection, timing/clock-tree queries, and Tcl evaluation. Tiles are rendered from ODB geometry and encoded as PNG using lodepng. - **JavaScript frontend** (`src/main.js`, `src/index.html`, `src/style.css`) — A single-page application using Leaflet.js for the map and GoldenLayout for resizable panels. Communicates with the server over a binary WebSocket protocol. ## Server API The browser↔server protocol (WebSocket message types, request fields, response shapes, error contract) is documented in [`docs/server-api.md`](docs/server-api.md). ## Example scripts ```tcl # Start the web viewer, pointing at the web assets directory web_server -dir /path/to/OpenROAD/src/web/src ``` ## Regression tests There are a set of regression tests in `./test`. ```shell bazel test //src/web/test/... ``` ## License BSD 3-Clause License. See [LICENSE](../../LICENSE) file. # README.html.md # Global Routing The global routing module in OpenROAD (`grt`) is based on FastRoute, an open-source global router originally derived from Iowa State University’s FastRoute4.1 algorithm. ## Commands #### NOTE - Parameters in square brackets `[-param param]` are optional. - Parameters without square brackets `-param2 param2` are required. ### Global Route This command performs global routing with the option to use a `guide_file`. You may also choose to use incremental global routing using `-start_incremental`. ```tcl global_route [-guide_file out_file] [-congestion_iterations iterations] [-congestion_report_file file_name] [-congestion_report_iter_step steps] [-grid_origin {x y}] [-critical_nets_percentage percent] [-skip_large_fanout_nets fanout] [-allow_congestion] [-snapshot_batched_width width] [-verbose] [-start_incremental] [-end_incremental] [-use_cugr] [-resistance_aware] [-infinite_cap] ``` #### Options | Switch Name | Description | |--------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-guide_file` | Set the output guides file name (e.g., `route.guide`). | | `-congestion_iterations` | Set the number of iterations made to remove the congestion of the routing. The default value is `50` for FastRoute and `5` when `-use_cugr` is set; the allowed values are integers `[0, MAX_INT]`. | | `-congestion_report_file` | Set the file name to save the congestion report. The file generated can be read by the DRC viewer in the GUI (e.g., `report_file.rpt`). | | `-congestion_report_iter_step` | Set the number of iterations to report. The default value is `0`, and the allowed values are integers `[0, MAX_INT]`. | | `-grid_origin` | Set the (x, y) origin of the routing grid in DBU. For example, `-grid_origin {1 1}` corresponds to the die (0, 0) + 1 DBU in each x–, y- direction. | | `-critical_nets_percentage` | Set the percentage of nets with the worst slack value that are considered timing critical, having preference over other nets during congestion iterations (e.g. `-critical_nets_percentage 30`). The default value is `0`, and the allowed values are integers `[0, MAX_INT]`. | | `-skip_large_fanout_nets` | Skips routing for nets with a fanout higher than the specified limit. Nets above this pin count threshold are ignored by the global router and will not have routing guides, meaning they will also be skipped during detailed routing. This option is useful in debugging or estimation flows where high-fanout nets (such as pre-CTS clock nets) can be ignored. The default value is 0, indicating no fanout limit. The default value is `MAX_INT`. The allowed values are integers `[0, MAX_INT]`. | | `-allow_congestion` | Allow global routing results to be generated with remaining congestion. The default is false. | | `-verbose` | This flag enables the full reporting of the global routing. | | `-start_incremental` | This flag initializes the GRT listener to get the net modified. The default is false. | | `-end_incremental` | This flag run incremental GRT with the nets modified. The default is false. | | `-use_cugr` | This flag run GRT using CUGR as the router solver. NOTE: this is not ready for production. | | `-resistance_aware` | This flag enables resistance-aware layer assignment and 3D routing. NOTE: this is not ready for production. | | `-infinite_cap` | Enables “infinite” gcell capacity for testing purpose. NOTE: this is not recommended for production flows. | | `-snapshot_batched_width` | Set the semantic width of snapshot-batched routing (max batches per wave). The default is `0`, preserving the non-batched behavior. Set a positive integer to enable batched routing; allowed values are integers `[1, MAX_INT]`. Execution width still follows `set_thread_count`. NOTE: this is not recommended for production flows; it is intended for exploration and research projects. | ### Set Routing Layers This command sets the minimum and maximum routing layers for signal and clock nets. Example: `set_routing_layers -signal Metal2-Metal10 -clock Metal6-Metal9` ```tcl set_routing_layers [-signal min-max] [-clock min-max] ``` #### Options | Switch Name | Description | |---------------|--------------------------------------------------------------------------| | `-signal` | Set the min and max routing signal layer (names) in this format “%s-%s”. | | `-clock` | Set the min and max routing clock layer (names) in this format “%s-%s”. | ### Set Macro Extension This command sets the halo (in terms of GCells) along the boundaries of macros. A `GCell` is typically defined in terms of `Mx` routing tracks. Example: `set_macro_extension 2` ```tcl set_macro_extension extension ``` #### Options | Argument Name | Description | |-----------------|---------------------------------------------------------------------------------------------------------------| | `extension` | Number of `GCells` added to the blockage boundaries from macros. The default `GCell` size is 15 `M3` pitches. | ### Set Global Routing Layer Adjustment The `set_global_routing_layer_adjustment` command sets routing resource adjustments in the routing layers of the design. Such adjustments reduce the number of routing tracks that the global router assumes to exist. This promotes the spreading of routing and reduces peak congestion, to reduce challenges for detailed routing. You can set adjustment for a specific layer, e.g., `set_global_routing_layer_adjustment Metal4 0.5` reduces the routing resources of routing layer `Metal4` by 50%. You can also set adjustment for all layers at once using `*`, e.g., `set_global_routing_layer_adjustment * 0.3` reduces the routing resources of all routing layers by 30%. And, you can also set resource adjustment for a layer range, e.g.: `set_global_routing_layer_adjustment Metal4-Metal8 0.3` reduces the routing resources of routing layers `Metal4`, `Metal5`, `Metal6`, `Metal7` and `Metal8` by 30%. Negative adjustment values can be used to increase the capacity of a given metal layer. For example, `set_global_routing_layer_adjustment Metal5 -0.5` will increase the total capacity of `Metal5` by 50%. ```tcl set_global_routing_layer_adjustment layer adjustment ``` #### Options | Argument Name | Description | |-----------------|--------------------------------------------------------------------------------| | `layer` | String for the layer name. | | `adjustment` | Float indicating the percentage reduction of each edge in the specified layer. | ### Set Global Routing Region Adjustment Set global routing region adjustment. Example: `set_global_routing_region_adjustment {1.5 2 20 30.5} -layer Metal4 -adjustment 0.7` ```tcl set_global_routing_region_adjustment {lower_left_x lower_left_y upper_right_x upper_right_y} -layer layer -adjustment adjustment ``` #### Options | Switch Name | Description | |-------------------------------------------------------------------|--------------------------------------------------------------------------------| | `lower_left_x`, `lower_left_y`, `upper_right_x` , `upper_right_y` | Bounding box to consider. | | `-layer` | String for the layer name. | | `-adjustment` | Float indicating the percentage reduction of each edge in the specified layer. | ### Set Global Routing Randomness The command randomizes global routing by shuffling the order of the nets and randomly subtracts or adds to the capacities of a random set of edges. Example: `set_global_routing_random -seed 42 \ -capacities_perturbation_percentage 50 \ -perturbation_amount 2` ```tcl set_global_routing_random [-seed seed] [-capacities_perturbation_percentage percent] [-perturbation_amount value] ``` #### Options | Switch Name | Description | |---------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-seed` | Sets the random seed (must be non-zero for randomization). | | `-capacities_perturbation_percentage` | Sets the percentage of edges whose capacities are perturbed. By default, the edge capacities are perturbed by adding or subtracting 1 (track) from the original capacity. | | `-perturbation_amount` | Sets the perturbation value of the edge capacities. This option is only meaningful when `-capacities_perturbation_percentage` is used. | ### Set Specific Nets to Route The `set_nets_to_route` command defines a list of nets to route. Only the nets defined in this command are routed, leaving the remaining nets without any global route guides. ```tcl set_nets_to_route net_names ``` #### Options | Switch Name | Description | |---------------|------------------------------------------------| | `net_names` | Tcl list of set of nets (e.g. `{net1, net2}`). | ### Repair Antennas The `repair_antennas` command checks the global routing for antenna violations and repairs the violations by inserting diodes near the gates of the violating nets. By default the command runs only one iteration to repair antennas. Filler instances added by the `filler_placement` command should NOT be in the database when `repair_antennas` is called. See LEF/DEF 5.8 Language Reference, Appendix C, “Calculating and Fixing Process Antenna Violations” for a [description]() of antenna violations. If no `diode_cell` argument is specified the LEF cell with class CORE, ANTENNACELL will be used. If any repairs are made the filler instances are remove and must be placed with the `filler_placement` command. If the LEF technology layer `ANTENNADIFFSIDEAREARATIO` properties are constant instead of PWL, inserting diodes will not improve the antenna ratios, and thus, no diodes are inserted. The following warning message will be reported: ```default [WARNING GRT-0243] Unable to repair antennas on net with diodes. ``` ```tcl repair_antennas [diode_cell] [-iterations iterations] [-ratio_margin margin] ``` #### Options | Switch Name | Description | |-----------------|---------------------------------------------------------------------------------------------------------------| | `diode_cell` | Diode cell to fix antenna violations. | | `-iterations` | Number of iterations. The default value is `1`, and the allowed values are integers `[0, MAX_INT]`. | | `-ratio_margin` | Add a margin to the antenna ratios. The default value is `0`, and the allowed values are integers `[0, 100]`. | ### Draw Route Segments The `draw_route_segments` command draws the route segments for a set of nets in the GUI. ```tcl draw_route_segments net_names [-show_pin_locations] ``` #### Options | Switch Name | Description | |-----------------------|---------------------------------------------------------| | `net_names` | Tcl list of nets (e.g. `{net1 net2}`). | | `-show_pin_locations` | Draw circles for the pin positions on the routing grid. | ### Report Wirelength The `report_wire_length` command reports the wire length of the nets. Use the `-global_route` and the `-detailed_route` flags to report the wire length from global and detailed routing, respectively. If none of these flags are used, the tool will identify the state of the design and report the wire length accordingly. Example: `report_wire_length -net {clk net60} -global_route -detailed_route -verbose -file out.csv` ```tcl report_wire_length [-net net_list] [-file file] [-global_route] [-detailed_route] [-verbose] [-summary] ``` #### Options | Switch Name | Description | |-------------------|------------------------------------------------------------------------------------------------------| | `-net` | List of nets to report the wirelength. Use `*` to report the wire length for all nets of the design. | | `-file` | The name of the file for the wirelength report. | | `-global_route` | Report the wire length of the global routing. | | `-detailed_route` | Report the wire length of the detailed routing. | | `-verbose` | This flag enables the full reporting of the layer-wise wirelength information. | | `-summary` | This flag reports the wire length for each layer of the design. | ### Global Route Debug Mode The `global_route_debug` command allows you to start a debug mode to view the status of the Steiner Trees. It also allows you to dump the input positions for the Steiner tree creation of a net. This must be used before calling the `global_route` command. Set the name of the net and the trees that you want to visualize. ```tcl global_route_debug [-st] [-rst] [-tree2D] [-tree3D] [-edges3D] [-saveSttInput file_name] [-net net_name] ``` #### Options | Switch Name | Description | |-----------------|---------------------------------------------------------------------------------------| | `-st` | Show the Steiner Tree generated by `stt`. | | `-rst` | Show the Rectilinear Steiner Tree generated by `grt`. | | `-tree2D` | Show the Rectilinear Steiner Tree generated by `grt` after the congestion iterations. | | `-tree3D` | Show the 3D Rectilinear Steiner Tree post-layer assignment. | | `-edges3D` | Show each edge being rerouted post-layer assignment. | | `-saveSttInput` | File name to save `stt` input of a net. | | `-net` | The name of the net name to be displayed. | ### Read Global Routing Guides This command reads global routing guides. ```tcl read_guides file_name ``` #### Options | Switch Name | Description | |---------------|-------------------------------| | `file_name` | Path to global routing guide. | ### Write Global Routing Segments This command writes global routing segments, the raw routing data generated by the global routing tool. ```tcl write_global_route_segments file_name ``` #### Options | Switch Name | Description | |---------------|---------------------------------------| | `file_name` | Path to global routing segments file. | ### Read Global Routing Segments This command reads global routing segments, the raw routing data generated by the global routing tool. Reading this format allows to perform parasitics extraction, repair antennas and incremental routing over the input segments file. ```tcl read_global_route_segments file_name ``` #### Options | Switch Name | Description | |---------------|---------------------------------------| | `file_name` | Path to global routing segments file. | ### Estimate Path Resistance Between Two Pins This command calculates the path resistance between two pins considering the vias and wires connecting them. The two pins need to be connected by the same wire. ```tcl estimate_path_resistance pin_name_1 pin_name_2 [-verbose] ``` #### Options | Switch Name | Description | |---------------|-------------------------------| | `pin_name_1` | Pin name 1 (e.g., `_437_/Y`). | | `pin_name_2` | Pin name 1 (e.g., `_438_/A`). | | `-verbose` | Print path details. | ## Example scripts Examples scripts demonstrating how to run FastRoute on a sample design of `gcd` as follows: ```shell ./test/gcd.tcl ``` ## Useful Developer Commands If you are a developer, you might find these useful. More details can be found in the [source file](./src/GlobalRouter.cpp) or the [swig file](./src/GlobalRouter.i). | Command Name | Description | |-----------------------|-------------------------------------------------------------------------------------------| | `check_routing_layer` | Check if the layer is within the min/max routing layer specified. | | `parse_layer_name` | Get routing layer number from layer name | | `parse_layer_range` | Parses a range from `layer_range` argument of format (%s-%s). `cmd` argument is not used. | | `check_region` | Checks the defined region if its within the die area. | | `have_detailed_route` | Checks if block has detailed route already. | ## Regression tests There are a set of regression tests in `./test`. For more information, refer to this [section](../../README.md#regression-tests). Simply run the following script: ```shell ./test/regression ``` ## Limitations ## Using the Python interface to grt #### WARNING The `Python` interface is currently in development and is subject to change. The `Python` API tries to stay close to the API defined in the `C++` class `GlobalRouter` that is located [here](./include/grt/GlobalRouter.h) When initializing a design, a sequence of `Python` commands might look like the following: ```python from openroad import Design, Tech tech = Tech() tech.readLef(...) design = Design(tech) design.readDef(...) gr = design.getGlobalRouter() ``` Here are some options to the `global_route` command. (See `GlobalRouter.h` for a complete list) ```python gr.setGridOrigin(x, y) # int, default 0,0 gr.setCongestionReportFile(file_name) # string gr.setCongestionIterations(n) # int, default 50 gr.setAllowCongestion(allowCongestion) # boolean, default False gr.setCriticalNetsPercentage(percentage) # float gr.setMinRoutingLayer(minLayer) # int gr.setMaxRoutingLayer(maxLayer) # int gr.setMinLayerForClock(minLayer) # int gr.setMaxLayerForClock(maxLayer) # int gr.setVerbose(v) # boolean, default False ``` and when ready to actually do the global route: ```python gr.globalRoute(save_guides) # boolean, default False ``` If you have set `save_guides` to True, you can then save the guides in `file_name` with: ```python design.getBlock().writeGuides(file_name) ``` You can find the index of a named layer with ```python lindex = tech.getDB().getTech().findLayer(layer_name) ``` or, if you only have the `Python` design object ```python lindex = design.getTech().getDB().getTech().findLayer(layer_name) ``` Be aware that much of the error checking is done in `Tcl`, so that with the current `C++` / `Python` API, that might be an issue to deal with. There are also some useful `Python` functions located in the `grt_aux.py` [file](./test/grt_aux.py) but these are not considered a part of the *final* API and may be subject to change. ## FAQs Check out [GitHub discussion](https://github.com/The-OpenROAD-Project/OpenROAD/discussions/categories/q-a?discussions_q=category%3AQ%26A+fastroute+in%3Atitle) about this tool. ## References - Database comes from [OpenDB](https://github.com/The-OpenROAD-Project/OpenDB) - [FastRoute 4.1 documentation](src/fastroute/README.md). The FastRoute4.1 version was received from [Yue Xu](mailto:yuexu@iastate.edu) on June 15, 2019. - Min Pan, Yue Xu, Yanheng Zhang and Chris Chu. “FastRoute: An Efficient and High-Quality Global Router. VLSI Design, Article ID 608362, 2012.” Available [here](https://onlinelibrary.wiley.com/doi/10.1155/2012/608362). - C. J. Alpert, T. C. Hu, J. H. Huang, A. B. Kahng and D. Karger, “Prim-Dijkstra Tradeoffs for Improved Performance-Driven Global Routing”, IEEE Transactions on Computer-Aided Design of Integrated Circuits and Systems 14(7) (1995), pp. 890-896. Available [here](https://vlsicad.ucsd.edu/Publications/Journals/j18.pdf). ## License BSD 3-Clause License. See [LICENSE](../../LICENSE) file. # README.html.md # CUGR 2.0 CUGR 2.0, the successor of [CUGR](https://github.com/cuhk-eda/cu-gr), is a VLSI global routing tool developed by the research team supervised by Prof. Evangeline F. Y. Young at The Chinese University of Hong Kong (CUHK). CUGR 2.0 is a detailed routability-driven global router and its solution quality is solely determined by the final detailed routing results. Please read our paper for more technical details: * Jinwei Liu, Evangeline F. Y. Young, EDGE: Efficient DAG-Based Global Routing Engine, ACM/IEEE Design Automation Conference (DAC), San Francisco, CA, USA, July 9-13, 2023. (CUGR 2.0 supports ICCAD’19 benchmarks ([v2](http://iccad-contest.org/2019/Problem_C/iccad19_benchmarks_v2.tar.gz), [hidden](http://iccad-contest.org/2019/Problem_C/iccad19_hidden_benchmarks.tar.gz)).) ## 1. License READ THIS LICENSE AGREEMENT CAREFULLY BEFORE USING THIS PRODUCT. BY USING THIS PRODUCT YOU INDICATE YOUR ACCEPTANCE OF THE TERMS OF THE FOLLOWING AGREEMENT. THESE TERMS APPLY TO YOU AND ANY SUBSEQUENT LICENSEE OF THIS PRODUCT. License Agreement for CUGR 2.0 Copyright © 2023 by The Chinese University of Hong Kong All rights reserved CU-SD LICENSE (adapted from the original BSD license) Redistribution of the any code, with or without modification, are permitted provided that the conditions below are met. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. Neither the name nor trademark of the copyright holder or the author may be used to endorse or promote products derived from this software without specific prior written permission. Users are entirely responsible, to the exclusion of the author, for compliance with (a) regulations set by owners or administrators of employed equipment, (b) licensing terms of any other software, and © local, national, and international regulations regarding use, including those regarding import, export, and use of encryption software. # README.html.md FastRoute Min Pan, Yue Xu, Yanheng Zhang, Chris Chu Contacts: yuexu@iastate.edu Introduction FastRoute is a global routing tool for VLSI back-end design. It is based on sequential rip-up and re-route (RRR) and a lot of novel techniques. FastRoute 1.0 first uses FLUTE to construct congestion-driven Steiner trees, which will later undergo the edge shifting process to optimize tree structure to reduce congestion. It then uses pattern routing and maze routing with logistic function based cost function to solve the congestion problem. FastRoute 2.0 proposed monotonic routing and multi-source multi-sink maze routing techniques to enhance the capability to reduce congestion. FastRoute 3.0 introduced the virtual capacity technique to adaptively change the capacity associated with each global edge to divert wire usage from highly congested regions to less congested regions. FastRoute 4.0 proposed via-aware Steiner tree, 3-bend routing and a delicate layer assignment algorithm to effectively reduce via count while maintaining outstanding congestion reduction capability. FastRoute 4.1 simplifies the way the virtual capacities are updated and applies a single set of tuning parameters to all benchmark circuits. Literature 1. Chris Chu and Yiu-Chung Wong, FLUTE: Fast Lookup Table Based Rectilinear Steiner Minimal Tree Algorithm for VLSI Design. In IEEE Transactions on Computer-Aided Design, vol. 27, no. 1, pages 70-83, January 2008. 2. Min Pan and Chris Chu, FastRoute: A Step to Integrate Global Routing into Placement. IEEE/ACM International Conference on Computer-Aided Design, pages 464-471, 2006. 3. Min Pan and Chris Chu, FastRoute 2.0: A High-quality and Efficient Global Router. Asian and South Pacific Design Automation Conference, pages 250-255, 2007. 4. Yanheng Zhang, Yue Xu and Chris Chu, FastRoute 3.0: A Fast and High Quality Global Router Based on Virtual Capacity. IEEE/ACM International Conference on Computer-Aided Design, pages 344-349, 2008. 5. Yue Xu, Yanheng Zhang and Chris Chu. “FastRoute 4.0: Global Router with Efficient Via Minimization. Asian and South Pacific Design Automation Conference, pages 576-581, 2009. 6. Min Pan, Yue Xu, Yanheng Zhang and Chris Chu. “FastRoute: An Efficient and High-Quality Global Router. VLSI Design, Article ID 608362, 2012. # README.html.md # Parasitics estimation Parasitics estimation commands are described below. ## Commands #### NOTE - Parameters in square brackets `[-param param]` are optional. - Parameters without square brackets `-param2 param2` are required. ### Set Wire RC The `set_wire_rc` command sets the resistance and capacitance used to estimate delay of routing wires. Separate values can be specified for clock and data nets with the `-signal` and `-clock` flags. Without either `-signal` or `-clock` the resistance and capacitance for clocks and data nets are set. ```default # Either run set_wire_rc -clock ... -signal ... -layer ... # Or set_wire_rc -resistance ... -capacitance ... ``` ```tcl set_wire_rc [-clock] [-signal] [-data] [-corner corner] [-layers layers_list] or set_wire_rc [-h_resistance res] [-h_capacitance cap] [-v_resistance res] [-v_capacitance cap] or set_wire_rc [-clock] [-signal] [-data] [-corner corner] [-layer layer_name] or set_wire_rc [-resistance res] [-capacitance cap] ``` #### Options | Switch Name | Description | |------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-clock` | Enable setting of RC for clock nets. | | `-signal` | Enable setting of RC for signal nets. | | `-layers` | Use the LEF technology resistance and area/edge capacitance values for the layers. The values for each layers will be used for wires with the prefered layer direction, if 2 or more layers have the same prefered direction the avarege value is used for wires with that direction. This is used for a default width wire on the layer. | | `-layer` | Use the LEF technology resistance and area/edge capacitance values for the layer. This is used for a default width wire on the layer. | | `-resistance` | Resistance per unit length, units are from the first Liberty file read. | | `-capacitance` | Capacitance per unit length, units are from the first Liberty file read. | | `-h_resistance` | Resistance per unit length for horizontal wires, units are from the first Liberty file read. | | `-h_capacitance` | Capacitance per unit length for horizontal wires, units are from the first Liberty file read. | | `-v_resistance` | Resistance per unit length for vertical wires, units are from the first Liberty file read. | | `-v_capacitance` | Capacitance per unit length for vertical wires, units are from the first Liberty file read. | ### Set Layer RC The `set_layer_rc` command can be used to set the resistance and capacitance for a layer or via. This is useful if these values are missing from the LEF file, or to override the values in the LEF. ```tcl set_layer_rc [-layer layer] [-via via_layer] [-resistance res] [-capacitance cap] [-corner corner] ``` #### Options | Switch Name | Description | |----------------|---------------------------------------------------------------------------------| | `-layer` | Set layer name to modify. Note that the layer must be a routing layer. | | `-via` | Select via layer name. Note that via resistance is per cut/via, not area-based. | | `-resistance` | Resistance per unit length, same convention as `set_wire_rc`. | | `-capacitance` | Capacitance per unit length, same convention as `set_wire_rc`. | | `-corner` | Process corner to use. | ### Report Layer RC The `report_layer_rc` command reports the layer resistance and capacitance values used for parasitics estimation. These values were previously set with the `set_layer_rc` command or they originate from the LEF. ```tcl report_layer_rc [-corner corner] ``` #### Options | Switch Name | Description | |---------------|---------------------------| | `-corner` | Process corner to report. | ### Estimate Parasitics Estimate RC parasitics based on placed component pin locations. If there are no component locations, then no parasitics are added. The resistance and capacitance values are per distance unit of a routing wire. Use the `set_units` command to check units or `set_cmd_units` to change units. The goal is to represent “average” routing layer resistance and capacitance. If the set_wire_rc command is not called before resizing, then the default_wireload model specified in the first Liberty file read or with the SDC set_wire_load command is used to make parasitics. After the `global_route` command has been called, the global routing topology and layers can be used to estimate parasitics with the `-global_routing` flag. The optional argument `-spef_file` can be used to write the estimated parasitics using Standard Parasitic Exchange Format. ```tcl estimate_parasitics -placement|-global_routing [-spef_file spef_file] ``` #### Options | Switch Name | Description | |-----------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------| | `-placement` or `-global_routing` | Either of these flags must be set. Parasitics are estimated based after placement stage versus after global routing stage. | | `-spef_file` | Optional. File name to write SPEF files. If more than one corner is available for the design, the files will be written as filename_corner.spef. | ## Useful Developer Commands If you are a developer, you might find these useful. More details can be found in the [source file]() or the [swig file](). | Command Name | Description | |--------------------------|-------------------------------------------------------------| | `check_parasitics` | Check if the `estimate_parasitics` command has been called. | | `check_corner_wire_caps` | Check wire capacitance for corner. | | `dblayer_wire_rc` | Get layer RC values. | | `set_dblayer_wire_rc` | Set layer RC values. | ## Example scripts Examples scripts demonstrating how to run parasitics estimation on a sample design as follows: ```shell ./test/make_parasitics1.tcl ``` ## Regression tests There are a set of regression tests in `./test`. For more information, refer to this [section](../../README.md#regression-tests). Simply run the following script: ```shell ./test/regression ``` ## Limitations ## FAQs Check out [GitHub discussion](https://github.com/The-OpenROAD-Project/OpenROAD/discussions/categories/q-a?discussions_q=category%3AQ%26A+resizer) about this tool. ## License BSD 3-Clause License. See [LICENSE](../../LICENSE) file. # README.html.md # Detailed Routing The Detailed Routing (`drt`) module in OpenROAD is based on the open-source detailed router, TritonRoute. TritonRoute consists of several main building blocks, including pin access analysis, track assignment, initial detailed routing, search and repair, and a DRC engine. The initial development of the [router](https://vlsicad.ucsd.edu/Publications/Conferences/363/c363.pdf) is inspired by the [ISPD-2018 initial detailed routing contest](http://www.ispd.cc/contests/18/). However, the current framework differs and is built from scratch, aiming for an industrial-oriented scalable and flexible flow. TritonRoute provides industry-standard LEF/DEF interface with support of [ISPD-2018](http://www.ispd.cc/contests/18/) and [ISPD-2019](http://www.ispd.cc/contests/19/) contest-compatible route guide format. ## Commands #### NOTE - Parameters in square brackets `[-param param]` are optional. - Parameters without square brackets `-param2 param2` are required. ### Detailed Route This command performs detailed routing. Developer arguments - `-or_seed`, `-or_k` Distributed arguments - `-distributed` , `-remote_host`, `-remote_port`, `-shared_volume`, `-cloud_size` Pin Access arguments - `-via_in_pin_bottom_layer`, `-via_in_pin_top_layer`, `-via_access_layer`, `-min_access_points` ```tcl detailed_route [-output_maze filename] [-output_drc filename] [-output_guide_coverage filename] [-drc_report_iter_step step] [-db_process_node name] [-disable_via_gen] [-droute_end_iter iter] [-via_in_pin_bottom_layer layer] [-via_in_pin_top_layer layer] [-via_access_layer layer] [-or_seed seed] [-or_k k] [-bottom_routing_layer layer] [-top_routing_layer layer] [-verbose level] [-distributed] [-remote_host rhost] [-remote_port rport] [-shared_volume vol] [-cloud_size sz] [-clean_patches] [-no_pin_access] [-min_access_points count] [-save_guide_updates] [-repair_pdn_vias layer] [-single_step_dr] ``` #### Options | Switch Name | Description | |----------------------------|----------------------------------------------------------------------------------------------------------------------------------------------| | `-output_maze` | Path to output maze log file (e.g. `output_maze.log`). | | `-output_drc` | Path to output DRC report file (e.g. `output_drc.rpt`). | | `-output_guide_coverage` | Path to output guide coverage file (e.g. `sample_coverage.csv`). | | `-drc_report_iter_step` | Report DRC on each iteration which is a multiple of this step. The default value is `0`, and the allowed values are integers `[0, MAX_INT]`. | | `-db_process_node` | Specify the process node. | | `-disable_via_gen` | Option to diable via generation with bottom and top routing layer. The default value is disabled. | | `-droute_end_iter` | Number of detailed routing iterations. The default value is `-1`, and the allowed values are integers `[1, 64]`. | | `-via_in_pin_bottom_layer` | Refer to pin access arguments [here](). | | `-via_in_pin_top_layer` | Refer to pin access arguments [here](). | | `-via_access_layer` | Refer to pin access arguments [here](). | | `-min_access_points` | Refer to pin access arguments [here](). | | `-or_seed` | Refer to developer arguments [here](). | | `-or_k` | Refer to developer arguments [here](). | | `-bottom_routing_layer` | Deprecated. Use the `set_routing_layers` command instead. | | `-top_routing_layer` | Deprecated. Use the `set_routing_layers` command instead. | | `-verbose` | Sets verbose mode if the value is greater than 1, else non-verbose mode (must be integer, or error will be triggered.) | | `-distributed` | Refer to distributed arguments [here](). | | `-remote_host` | Refer to distributed arguments [here](). | | `-remote_port` | Refer to distributed arguments [here](). | | `-shared_volume` | Refer to distributed arguments [here](). | | `-cloud_size` | Refer to distributed arguments [here](). | | `-clean_patches` | Clean unneeded patches during detailed routing. | | `-no_pin_access` | Disables pin access for routing. | | `-save_guide_updates` | Flag to save guides updates. | | `-repair_pdn_vias` | This option is used for PDKs where M1 and M2 power rails run in parallel. | #### Developer arguments Some arguments that are helpful for developers are listed here. | Switch Name | Description | |---------------|--------------------------------------------------------------------------------------------------------------------------------------| | `-or_seed` | Random seed for the order of nets to reroute. The default value is `-1`, and the allowed values are integers `[0, MAX_INT]`. | | `-or_k` | Number of swaps is given by $k * sizeof(rerouteNets)$. The default value is `0`, and the allowed values are integers `[0, MAX_INT]`. | ### Detailed Route Debugging The following command and arguments are useful when debugging error messages from `drt` and to understand its behavior. ```tcl detailed_route_debug [-pa] [-ta] [-dr] [-maze] [-net name] [-pin name] [-box x1 y1 x2 y2] [-iter iter] [-pa_markers] [-dump_dr] [-dump_dir dir] [-snapshot_dir dir] [-dump_last_worker] [-pa_edge] [-pa_commit] [-write_net_tracks] ``` #### Options | Switch Name | Description | |---------------------|-------------------------------------------------------------------------------------------------------------------------| | `-pa` | Enable debug for pin access. | | `-ta` | Enable debug for track assignment. | | `-dr` | Enable debug for detailed routing. | | `-maze` | Enable debug for maze routing. | | `-net` | Enable debug for net name. | | `-pin` | Enable debug for pin name. | | `-box` | Set the box for debugging given by lower left/upper right coordinates. | | `-worker` | Debugs routes that pass through the point `{x, y}`. | | `-iter` | Specifies the number of debug iterations. The default value is `0`, and the accepted values are integers `[0, MAX_INT`. | | `-pa_markers` | Enable pin access markers. | | `-dump_dr` | Filename for detailed routing dump. | | `-dump_dir` | Directory for detailed routing dump. | | `-snapshot_dir` | Directory for snapshots produced if the debug level of `DRT snapshot` is set to 1. | | `-pa_edge` | Enable visibility of pin access edges. | | `-pa_commit` | Enable visibility of pin access commits. | | `-write_net_tracks` | Enable writing of net track assigments. | ### Check Pin Access This function checks pin access. ```tcl pin_access [-db_process_node name] [-bottom_routing_layer layer] [-top_routing_layer layer] [-via_access_layer layer] [-via_in_pin_bottom_layer layer] [-via_in_pin_top_layer layer] [-min_access_points count] [-verbose level] [-distributed] [-remote_host rhost] [-remote_port rport] [-shared_volume vol] [-cloud_size sz] ``` #### Options | Switch Name | Description | |----------------------------|------------------------------------------------------------------------------------------------------------------------| | `-db_process_node` | Specify process node. | | `-bottom_routing_layer` | Deprecated. Use the `set_routing_layers` command instead. | | `-top_routing_layer` | Deprecated. Use the `set_routing_layers` command instead. | | `-via_access_layer` | Refer to pin access arguments [here](). | | `-via_in_pin_bottom_layer` | Refer to pin access arguments [here](). | | `-via_in_pin_top_layer` | Refer to pin access arguments [here](). | | `-min_access_points` | Refer to pin access arguments [here](). | | `-verbose` | Sets verbose mode if the value is greater than 1, else non-verbose mode (must be integer, or error will be triggered.) | | `-distributed` | Refer to distributed arguments [here](). | | `-remote_host` | Refer to distributed arguments [here](). | | `-remote_port` | Refer to distributed arguments [here](). | | `-shared_volume` | Refer to distributed arguments [here](). | | `-cloud_size` | Refer to distributed arguments [here](). | #### Pin Access Arguments We have compiled all pin access related arguments in this section. | Switch Name | Description | |----------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-via_access_layer` | Top via access layer name. Any pin on this layer or below can only be accessed through a via, disallowing planar access. | | `-via_in_pin_bottom_layer` | Via-in pin bottom layer name. Used in conjunction with via_in_pin_top_layer to specify the layer range for via-in-pin rules. | | `-via_in_pin_top_layer` | Via-in pin top layer name. Used in conjunction with via_in_pin_bottom_layer to specify the layer range for via-in-pin rules. For pins within this layer range, any via enclosure must be fully contained within the pin boundary and cannot extend beyond the pin edges. | | `-min_access_points` | Minimum number of access points per pin. | #### Distributed Arguments We have compiled all distributed arguments in this section. #### NOTE Additional setup is required. Please refer to this [guide](doc/Distributed.md). | Switch Name | Description | |------------------|-----------------------------------------------------------| | `-distributed` | Enable distributed mode with Kubernetes and Google Cloud. | | `-remote_host` | The host IP. | | `-remote_port` | The value of the port to access from. | | `-shared_volume` | The mount path of the nfs shared folder. | | `-cloud_size` | The number of workers. | ## Useful Developer Commands If you are a developer, you might find these useful. More details can be found in the [source file](./src/TritonRoute.cpp) or the [swig file](./src/TritonRoute.i). | Command Name | Description | |-------------------------------------------|----------------------------------------------| | `detailed_route_set_default_via` | Set default via. | | `detailed_route_set_unidirectional_layer` | Set unidirectional layer. | | `step_dr` | Refer to function `detailed_route_step_drt`. | | `check_drc` | Refer to function `check_drc_cmd`. | ## Example scripts Example script demonstrating how to run TritonRoute on a sample design of `gcd` in the Nangate45 technology node. ```shell # single machine example ./test/gcd_nangate45.tcl # distributed example ./test/gcd_nangate45_distributed.tcl ``` ## Regression tests There are a set of regression tests in `./test`. For more information, refer to this [section](../../README.md#regression-tests). Simply run the following script: ```shell ./test/regression ``` ## Limitations ## FAQs Check out [GitHub discussion](https://github.com/The-OpenROAD-Project/OpenROAD/discussions/categories/q-a?discussions_q=category%3AQ%26A+tritonroute+in%3Atitle) about this tool. ## References Please cite the following paper(s) for publication: 1. A. B. Kahng, L. Wang and B. Xu, “TritonRoute: The Open Source Detailed Router”, IEEE Transactions on Computer-Aided Design of Integrated Circuits and Systems (2020), doi:10.1109/TCAD.2020.3003234. [(.pdf)](https://ieeexplore.ieee.org/ielaam/43/9358030/9120211-aam.pdf) 2. A. B. Kahng, L. Wang and B. Xu, “The Tao of PAO: Anatomy of a Pin Access Oracle for Detailed Routing”, Proc. ACM/IEEE Design Automation Conf., 2020, pp. 1-6. [(.pdf)](https://vlsicad.ucsd.edu/Publications/Conferences/377/c377.pdf) ## Authors TritonRoute was developed by graduate students Lutong Wang and Bangqi Xu from UC San Diego, and serves as the detailed router in the [OpenROAD](https://theopenroadproject.org/) project. ## License BSD 3-Clause License. See [LICENSE](../../LICENSE) file. # README.html.md # Clock Tree Synthesis The clock tree synthesis module in OpenROAD (`cts`) is based on TritonCTS 2.0. It is available from the `clock_tree_synthesis` command. TritonCTS 2.0 performs on-the-fly characterization. Thus, there is no need to generate characterization data. The on-the-fly characterization feature can be optionally controlled by parameters specified by the `configure_cts_characterization` command. Use `set_wire_rc` command to set the clock routing layer. ## Commands #### NOTE - Parameters in square brackets `[-param param]` are optional. - Parameters without square brackets `-param2 param2` are required. ### Configure CTS Characterization Configure key CTS characterization parameters, for example maximum slew and capacitance, as well as the number of steps they will be divided for characterization. ```tcl configure_cts_characterization [-max_slew max_slew] [-max_cap max_cap] [-slew_steps slew_steps] [-cap_steps cap_steps] ``` #### Options | Switch Name | Description | |---------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-max_slew` | Max slew value (in the current time unit) that the characterization will test. If this parameter is omitted, the code would use max slew value for specified buffer in `buf_list` from liberty file. | | `-max_cap` | Max capacitance value (in the current capacitance unit) that the characterization will test. If this parameter is omitted, the code would use max cap value for specified buffer in `buf_list` from liberty file. | | `-slew_steps` | Number of steps that `max_slew` will be divided into for characterization. The default value is `12`, and the allowed values are integers `[0, MAX_INT]`. | | `-cap_steps` | Number of steps that `max_cap` will be divided into for characterization. The default value is `34`, and the allowed values are integers `[0, MAX_INT]`. | ### Clock Tree Synthesis Perform clock tree synthesis. ```tcl clock_tree_synthesis [-wire_unit wire_unit] [-buf_list ] [-root_buf root_buf] [-clk_nets ] [-tree_buf ] [-distance_between_buffers] [-branching_point_buffers_distance] [-clustering_exponent] [-clustering_unbalance_ratio] [-sink_clustering_size cluster_size] [-sink_clustering_max_diameter max_diameter] [-macro_clustering_size cluster_size] [-macro_clustering_max_diameter max_diameter] [-sink_clustering_enable] [-balance_levels] [-sink_clustering_levels levels] [-num_static_layers] [-sink_clustering_buffer] [-obstruction_aware] [-apply_ndr strategy] [-insertion_delay] [-dont_use_dummy_load] [-sink_buffer_max_cap_derate derate_value] [-delay_buffer_derate derate_value] [-library liberty_library_name] [-repair_clock_nets] [-no_insertion_delay] ``` #### Options | Switch Name | Description | |-------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-buf_list` | Tcl list of master cells (buffers) that will be considered when making the wire segments (e.g. `{BUFXX, BUFYY}`). | | `-root_buffer` | The master cell of the buffer that serves as root for the clock tree. If this parameter is omitted, the first master cell from `-buf_list` is taken. | | `-wire_unit` | Minimum unit distance between buffers for a specific wire. If this parameter is omitted, the code gets the value from ten times the height of `-root_buffer`. | | `-distance_between_buffers` | Distance (in microns) between buffers that `cts` should use when creating the tree. When using this parameter, the clock tree algorithm is simplified and only uses a fraction of the segments from the LUT. | | `-branching_point_buffers_distance` | Distance (in microns) that a branch has to have in order for a buffer to be inserted on a branch end-point. This requires the `-distance_between_buffers` value to be set. | | `-clustering_exponent` | Value that determines the power used on the difference between sink and means on the CKMeans clustering algorithm. The default value is `4`, and the allowed values are integers `[0, MAX_INT]`. | | `-clustering_unbalance_ratio` | Value determines each cluster’s maximum capacity during CKMeans. A value of `0.5` (i.e., 50%) means that each cluster will have exactly half of all sinks for a specific region (half for each branch). The default value is `0.6`, and the allowed values are floats `[0, 1.0]`. | | `-sink_clustering_enable` | Enables pre-clustering of sinks to create one level of sub-tree before building H-tree. Each cluster is driven by buffer which becomes end point of H-tree structure. | | `-sink_clustering_size` | Specifies the maximum number of sinks per cluster for the register tree. The allowed values are integers `[0, MAX_INT]`. If this is not specified the size will be automatically chosen between `10, 20 or 30` based on the tree buffer max cap. | | `-sink_clustering_max_diameter` | Specifies maximum diameter (in microns) of sink cluster for the register tree. The allowed values are integers `[0, MAX_INT]`. If this is not specified the diameter will be automatically chosen between `50, 100 or 200`, based on the tree buffer max cap. | | `-macro_clustering_size` | Specifies the maximum number of sinks per cluster for the macro tree. The default value is `4`, and the allowed values are integers `[0, MAX_INT]`. | | `-macro_clustering_max_diameter` | Specifies maximum diameter (in microns) of sink cluster for the macro tree. The default value is `50`, and the allowed values are integers `[0, MAX_INT]`. | | `-balance_levels` | Attempt to keep a similar number of levels in the clock tree across non-register cells (e.g., clock-gate or inverter). The default value is `False`, and the allowed values are bool. | | `-clk_nets` | String containing the names of the clock roots. If this parameter is omitted, `cts` looks for the clock roots automatically. | | `-num_static_layers` | Set the number of static layers. The default value is `0`, and the allowed values are integers `[0, MAX_INT]`. | | `-sink_clustering_buffer` | Set the sink clustering buffer(s) to be used. | | `-obstruction_aware` | Enables obstruction-aware buffering such that clock buffers are not placed on top of blockages or hard macros. This option may reduce legalizer displacement, leading to better latency, skew or timing QoR. The default value is `False`, and the allowed values are bool. | | `-apply_ndr` | Applies 2X spacing non-default rule to clock nets except leaf-level nets following some strategy. There are four strategy options: `none, root_only, half, full`. If this is not specified, the default value is `none`. | | `-dont_use_dummy_load` | Don’t apply dummy buffer or inverter cells at clock tree leaves to balance loads. The default values is `False`. | | `-sink_buffer_max_cap_derate` | Use this option to control automatic buffer selection. To favor strong(weak) drive strength buffers use a small(large) value. The default value is `0.01`, meaning that buffers are selected by derating max cap limit by 0.01. The value of 1.0 means no derating of max cap limit. | | `-delay_buffer_derate` | This option balances latencies between macro cells and registers by inserting delay buffers. The default value is `1.0`, meaning all needed delay buffers are inserted. A value of 0.5 means only half of necessary delay buffers are inserted. A value of 0.0 means no insertion of delay buffers. | | `-library` | This option specifies the name of Liberty library from which clock buffers will be selected, such as the LVT or uLVT library. It is assumed that the library has already been loaded using the read_liberty command. If this option is not specified, clock buffers will be chosen from the currently loaded libraries, which may not include LVT or uLVT cells. | | `-repair_clock_nets` | This option includes fixing long wires inside CTS prior to latency adjustment with delay buffers. This can lead to a more balanced clock tree. The default is not to perform clock net repair. | | `-no_insertion_delay` | Ignore sink insertion delay in clock tree construction and balancing. | #### Instance Name Prefixes `clock_tree_synthesis` uses the following prefixes for the instances that it inserts: | Instance Prefix | Purpose | |-------------------|--------------------------------------------| | clkbuf_regs | Splitting registers from macros | | clkload | Dummy loads to help balance the clock tree | | delaybuf | Delay buffers to help balance the tree | ### Report CTS This command is used to extract the following metrics after a successful `clock_tree_synthesis` run. - Number of Clock Roots - Number of Buffers Inserted - Number of Clock Subnets - Number of Sinks. ```tcl report_cts [-out_file file] ``` #### Options | Switch Name | Description | |---------------|-----------------------------------------------------------------------------------------------------------------| | `-out_file` | The file to save `cts` reports. If this parameter is omitted, the report is streamed to `stdout` and not saved. | ### Set CTS configuration This command is used to set the configuration of CTS. ```tcl set_cts_config [-apply_ndr strategy] [-buf_list ] [-branching_point_buffers_distance distance] [-clock_buffer_footprint string] [-clock_buffer_string string] [-clustering_exponent power] [-clustering_unbalance_ratio capacity] [-delay_buffer_derate derate_value] [-distance_between_buffers distance] [-library liberty_library_name] [-macro_clustering_max_diameter max_diameter] [-macro_clustering_size cluster_size] [-num_static_layers num_layers] [-root_buf root_buf] [-sink_buffer_max_cap_derate derate_value] [-sink_clustering_levels levels] [-sink_clustering_max_diameter max_diameter] [-sink_clustering_size cluster_size] [-skip_nets ] [-tree_buf ] [-wire_unit wire_unit] ``` #### Options | Switch Name | Description | |-------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-apply_ndr` | Applies 2X spacing non-default rule to clock nets except leaf-level nets following some strategy. There are four strategy options: `none, root_only, half, full`. If this is not specified, the default value is `none`. | | `-buf_list` | Tcl list of master cells (buffers) that will be considered when making the wire segments (e.g. `{BUFXX, BUFYY}`). | | `-branching_point_buffers_distance` | Distance (in microns) that a branch has to have in order for a buffer to be inserted on a branch end-point. This requires the `-distance_between_buffers` value to be set. | | `-clock_buffer_footprint` | sub-string that identifies clock buffers by liberty cell_footprint attribute. This option is mutually exclusive with -clock_buffer_string. | | `-clock_buffer_string` | sub-string that identifies clock buffers by name. The default is CLKBUF. This option is mutally exclusive with -clock_buffer_footprint. | | `-clustering_exponent` | Value that determines the power used on the difference between sink and means on the CKMeans clustering algorithm. The default value is `4`, and the allowed values are integers `[0, MAX_INT]`. | | `-clustering_unbalance_ratio` | Value determines each cluster’s maximum capacity during CKMeans. A value of `0.5` (i.e., 50%) means that each cluster will have exactly half of all sinks for a specific region (half for each branch). The default value is `0.6`, and the allowed values are floats `[0, 1.0]`. | | `-delay_buffer_derate` | This option balances latencies between macro cells and registers by inserting delay buffers. The default value is `1.0`, meaning all needed delay buffers are inserted. A value of 0.5 means only half of necessary delay buffers are inserted. A value of 0.0 means no insertion of delay buffers. | | `-distance_between_buffers` | Distance (in microns) between buffers that `cts` should use when creating the tree. When using this parameter, the clock tree algorithm is simplified and only uses a fraction of the segments from the LUT. | | `-library` | This option specifies the name of Liberty library from which clock buffers will be selected, such as the LVT or uLVT library. It is assumed that the library has already been loaded using the read_liberty command. If this option is not specified, clock buffers will be chosen from the currently loaded libraries, which may not include LVT or uLVT cells. | | `-macro_clustering_max_diameter` | Specifies maximum diameter (in microns) of sink cluster for the macro tree. The default value is `50`, and the allowed values are integers `[0, MAX_INT]`. | | `-macro_clustering_size` | Specifies the maximum number of sinks per cluster for the macro tree. The default value is `4`, and the allowed values are integers `[0, MAX_INT]`. | | `-num_static_layers` | Set the number of static layers. The default value is `0`, and the allowed values are integers `[0, MAX_INT]`. | | `-root_buffer` | The master cell of the buffer that serves as root for the clock tree. If this parameter is omitted, the first master cell from `-buf_list` is taken. | | `-sink_buffer_max_cap_derate` | Use this option to control automatic buffer selection. To favor strong(weak) drive strength buffers use a small(large) value. The default value is `0.01`, meaning that buffers are selected by derating max cap limit by 0.01. The value of 1.0 means no derating of max cap limit. | | `-sink_clustering_levels` | … | | `-sink_clustering_max_diameter` | Specifies maximum diameter (in microns) of sink cluster for the register tree. The allowed values are integers `[0, MAX_INT]`. If this is not specified the diameter will be automatically chosen between `50, 100 or 200`, based on the tree buffer max cap. | | `-sink_clustering_size` | Specifies the maximum number of sinks per cluster for the register tree. The allowed values are integers `[0, MAX_INT]`. If this is not specified the size will be automatically chosen between `10, 20 or 30` based on the tree buffer max cap. | | `-sink_clustering_levels` | … | | `-skip_nets` | Tcl list containing the clock nets to be skipped (e.g. `{net1, net2}`). If the net is a root clock net, the whole clock is skipped, otherwise only the subnet specified is skipped. | | `-wire_unit` | Minimum unit distance between buffers for a specific wire. If this parameter is omitted, the code gets the value from ten times the height of `-root_buffer`. | ### Report CTS configuration This command is used to extract the configuration of CTS. ```tcl report_cts_config ``` ### Reset CTS configuration This command is used to reset the configuration of CTS. The flags determine which configurations will be reset to their default values. Using it without a flag means resetting all configurations. ```tcl reset_cts_config [-apply_ndr] [-buf_list] [-branching_point_buffers_distance] [-clock_buffer_footprint] [-clock_buffer_string] [-clustering_exponent] [-clustering_unbalance_ratio] [-delay_buffer_derate] [-distance_between_buffers] [-library] [-macro_clustering_max_diameter] [-macro_clustering_size] [-num_static_layers] [-root_buf] [-sink_buffer_max_cap_derate] [-sink_clustering_levels] [-sink_clustering_max_diameter] [-sink_clustering_size] [-skip_nets] [-tree_buf] [-wire_unit] ``` ## Useful Developer Commands If you are a developer, you might find these useful. More details can be found in the [source file](./src/TritonCTS.cpp) or the [swig file](./src/TritonCTS.i). | Command Name | Description | |------------------------------|--------------------------------| | `clock_tree_synthesis_debug` | Option to plot the CTS to GUI. | ## Example scripts ```default clock_tree_synthesis -root_buf "BUF_X4" \ -buf_list "BUF_X4" \ -wire_unit 20 report_cts "file.txt" ``` ## Regression tests There are a set of regression tests in `./test`. For more information, refer to this [section](../../README.md#regression-tests). Simply run the following script: ```shell ./test/regression ``` ## Limitations ## FAQs Check out [GitHub discussion](https://github.com/The-OpenROAD-Project/OpenROAD/discussions/categories/q-a?discussions_q=category%3AQ%26A+cts) about this tool. ## References 1. [LEMON](https://lemon.cs.elte.hu/trac/lemon) - **L**ibrary for **E**fficient **M**odeling and **O**ptimization in **N**etworks 2. Kahng, A. B., Li, J., & Wang, L. (2016, November). Improved flop tray-based design implementation for power reduction. In 2016 IEEE/ACM International Conference on Computer-Aided Design (ICCAD) (pp. 1-8). IEEE. [(.pdf)](https://vlsicad.ucsd.edu/Publications/Conferences/344/c344.pdf) ## Authors TritonCTS 2.0 is written by Mateus Fogaça, PhD student in the Graduate Program on Microelectronics from the Federal University of Rio Grande do Sul (UFRGS), Brazil. Mr. Fogaça’s advisor is Prof. Ricardo Reis. Many guidance provided by (alphabetic order): - Andrew B. Kahng - Jiajia Li - Kwangsoo Han - Tom Spyrou ## License BSD 3-Clause License. See [LICENSE](../../LICENSE) file. # README.html.md # Antenna Rule Checker This tool checks antenna violations and generates a report to indicate violated nets. See LEF/DEF 5.8 Language Reference, Appendix C, “Calculating and Fixing Process Antenna Violations” (p.389) for a [description](https://coriolis.lip6.fr/doc/lefdef/lefdefref/lefdefref.pdf) of antenna violations. This is an example of the detailed and simple reports of the antenna checker: | ![image](main/src/ant/doc/images/ant_report_print.png) | Abbreviations Index: - `PAR`: Partial Area Ratio - `CAR`: Cumulative Area Ratio - `Area`: Gate Area - `S. Area`: Side Diffusion Area - `C. Area`: Cumulative Gate Area - `C. S. Area`: Cumulative Side (Diffusion) Area Antenna violations can be repaired after global routing with the `repair_design` command. ## Commands #### NOTE - Parameters in square brackets `[-param param]` are optional. - Parameters without square brackets `-param2 param2` are required. ### Check Antennas The `check_antennas` command will check for antenna violations. ```tcl check_antennas [-net net] [-verbose] ``` #### Options | Switch Name | Description | |---------------|-----------------------------------------------------| | `-verbose` | Report all antenna calculations for violating nets. | | `-net` | Check antennas on the specified net. | ## Regression tests There are a set of regression tests in `./test`. For more information, refer to this [section](../../README.md#regression-tests). Simply run the following script: ```shell ./test/regression ``` ## Limitations ## FAQs Check out [GitHub discussion](https://github.com/The-OpenROAD-Project/OpenROAD/discussions/categories/q-a?discussions_q=category%3AQ%26A+antenna+in%3Atitle) about this tool. ## Algorithm | ![image](main/src/ant/doc/images/example_ant.png) | ![image](main/src/ant/doc/images/step1.png) | |---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **Antenna Checker Algorithm**: WireGraph Example | **Step 1**: (a) Start from the root node (ITerm) using upper Via to find a node for a new wire. (b) Save the ITerm area for cumulative gate/diffusion area. | | ![image](main/src/ant/doc/images/step2.png) | ![image](main/src/ant/doc/images/step3.png) | | **Step 2**: From the node of the wire, find all the nodes in the wire through segment wires and find the “root” node of this wire. | **Step 3**: (a) From the “root” node of the wire, along the outgoing segment edge that goes to other nodes belonging to this wire, calculate the area of this wire. (b) Then, find all the ITerms below these nodes, except for the root node (directly use an ITerm or lower Vias to find ITerms for lower metals). © Sum up the areas of all the ITerms found with the cumulative areas and calculate the PAR of this wire. (d) Add the PAR value and the wire info (layer, Index) into the PAR table. Add the new area to the cumulative areas. | | ![image](main/src/ant/doc/images/step4.png) | ![image](main/src/ant/doc/images/step5.png) | | **Step 4**: Find all the upper Vias on this wire (for all the nodes on this wire), and go to the higher-level metal. | **Step 5**: Repeat Steps 2 and 3 for new-found upper-level wires. | | ![image](main/src/ant/doc/images/step6.png) | ![image](main/src/ant/doc/images/step7.png) | | **Step 6**: Repeat Steps 4 and 5 until we reach a wire that cannot have upper Vias for its nodes (highest-level metal). | **Step 7**: Pick up another ITerm as a root node and repeat Steps 1 to 6, skipping the wires already in the PAR table. Repeat this for all the ITerms to get a whole PAR table. | | ![image](main/src/ant/doc/images/step8.png) | | | **Step 8**: (a) Pick up a gate ITerm and a node of a wire (e.g., M4,1). Find possible paths that connect them, look up the PAR value of the wires along these paths, and add them up to get the CAR of the (gate, wire) pair. (b) Compare to the AntennaRule to see if the CAR violates the rules. © Check this for all (gate, wire) pairs. | | ## License BSD 3-Clause License. See [LICENSE](../../LICENSE) file. # README.html.md # Graphical User Interface The graphical user interface can be access by launching OpenROAD with `-gui` or by opening it from the command-line with `gui::show`. ## Commands #### NOTE - Parameters in square brackets `[-param param]` are optional. - Parameters without square brackets `-param2 param2` are required. ### Add Buttons to the Toolbar This command creates toolbar button with name set using the `-text` flag and accompanying logic in the `-script` flag. Returns: name of the new button, either `name` or `buttonX`. ```tcl create_toolbar_button [-name name] -text button_text -script tcl_script [-echo] ``` #### Options | Switch Name | Description | |---------------|----------------------------------------------------------------------------------| | `-name` | The name of the button, used when deleting the button. | | `-text` | The text to put on the button. | | `-script` | The tcl script to evaluate when the button is pressed. | | `-echo` | This indicate that the commands in the `tcl_script` should be echoed in the log. | ### Remove Toolbar Button To remove toolbar button: ```tcl gui::remove_toolbar_button name ``` #### Options | Switch Name | Description | |---------------|--------------------------------------------------------| | `-name` | The name of the button, used when deleting the button. | ### Add items to the Menubar This command add items to the menubar. Returns: name of the new item, either `name` or `actionX`. ```tcl create_menu_item [-name name] [-path menu_path] -text item_text -script tcl_script [-shortcut key_shortcut] [-echo] ``` #### Options | Switch Name | Description | |---------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-name` | (optional) name of the item, used when deleting the item. | | `-path` | (optional) Menu path to place the new item in (hierarchy is separated by /), defaults to “Custom Scripts”, but this can also be “Tools” or “New menu/New submenu”. | | `-text` | The text to put on the item. | | `-script` | The tcl script to evaluate when the button is pressed. | | `-shortcut` | (optional) key shortcut to trigger this item. | | `-echo` | (optional) indicate that the commands in the `tcl_script` should be echoed in the log. | ### Remove items from the Menubar To remove menu item: ```tcl gui::remove_menu_item name ``` #### Options | Switch Name | Description | |---------------|------------------------------------------------| | `-name` | name of the item, used when deleting the item. | ### Save Clocktree Image This command saves the screenshot of clocktree given options to `filename`. ```tcl save_clocktree_image filename -clock clock_name [-width width] [-height height] [-scene scene] ``` #### Options | Switch Name | Description | |---------------|-----------------------------------------------------------------------------------------| | `filename` | path to save the image to. | | `-clock` | name of the clock to save the clocktree for. | | `-scene` | name of the timing scene to save the clocktree for, default to the first scene defined. | | `-height` | height of the image in pixels, defaults to the height of the GUI widget. | | `-width` | width of the image in pixels, defaults to the width of the GUI widget. | ### Save Timing Histogram Image This command saves the screenshot of timing histogram given options to `filename`. ```tcl save_histogram_image filename [-mode mode] [-width width] [-height height] ``` #### Options | Switch Name | Description | |---------------|---------------------------------------------------| | `filename` | path to save the image to. | | `-mode` | chart mode to save, defaults to “setup”. | | `-height` | height of the image in pixels, defaults to 500px. | | `-width` | width of the image in pixels, defaults to 500px. | ### Generate animated images This command can be used to generate an animated gif. When used with -start this command returns an integer key that can be used to distinguish files if multiple are generated. That key can be provided when using -add or -end. If only a single file is being used the key can be ignored. ```tcl save_animated_gif -start|-add|-end [-resolution microns_per_pixel] [-area {x0 y0 x1 y1}] [-width width] [-delay delay] [-key key] [filename] ``` #### Options | Switch Name | Description | |---------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-start` | start a new animation. | | `-add` | add a new frame to the animation. | | `-end` | terminate the animtion and save file. | | `filename` | path to save the animation to. | | `-area` | x0, y0 - first corner of the layout area (in microns) to be saved, default is to save what is visible on the screen unless called when gui is not active and then it selected the whole block. x1, y1 - second corner of the layout area (in microns) to be saved, default is to save what is visible on the screen unless called when gui is not active and then it selected the whole block. | | `-resolution` | resolution in microns per pixel to use when saving the image, default will match what the GUI has selected. | | `-width` | width of the output image in pixels, default will be computed from the resolution. Cannot be used with `-resolution`. | | `-delay` | delay between frames in the GIF. | | `-key` | used to distinguish multiple GIF files (returned by -add). Defaults to the most recent GIF. | ### Select Objects This command selects object based on options. Returns: number of objects selected. ```tcl select -type object_type [-name glob_pattern] [-filter attribute=value] [-case_insensitive] [-highlight group] ``` #### Options | Switch Name | Description | |---------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-type` | name of the object type. For example, `Inst` for instances, `Net` for nets, and `Marker` for database markers. | | `-name` | (optional) filter selection by the specified name. For example, to only select clk nets `*clk*`. Use `-case_insensitive` to filter based on case insensitive instead of case sensitive. | | `-filter` | (optional) filter selection based on the objects’ properties. `attribute` represents the property’s name and `value` the property’s value. In case the property holds a collection (e. g. BTerms in a Net) or a table (e. g. Layers in a Generate Via Rule) `value` can be any element within those. A special case exists for checking whether a collection is empty or not by using the value `CONNECTED`. This can be useful to select a specific group of elements (e. g. BTerms=CONNECTED will select only Nets connected to Input/Output Pins). | | `-highlight` | (optional) add the selection to the specific highlighting group. Values can be 0 to 7. | ### Display Timing Cones This command displays timing cones for a pin given options. ```tcl display_timing_cone pin [-fanin] [-fanout] [-off] ``` #### Options | Switch Name | Description | |---------------|--------------------------------------------| | `pin` | name of the instance or block pin. | | `-fanin` | (optional) display the fanin timing cone. | | `-fanout` | (optional) display the fanout timing cone. | | `-off` | (optional) remove the timing cone. | ### Focus Net This command limits the drawing to specified net. ```tcl focus_net net [-remove] [-clear] ``` #### Options | Switch Name | Description | |---------------|-------------------------------------------------| | `pin` | name of the net. | | `-remove` | (optional) removes the net from from the focus. | | `-clear` | (optional) clears all nets from focus. | ## TCL functions ### Is GUI Enabled Determine is the GUI is active: ```tcl gui::enabled ``` ### Trigger GUI to Load Design Announce to the GUI that a design was loaded (note: this is only needed when the design was loaded through the odb API and not via `read_def` or `read_db`): ```tcl gui::design_created ``` ### Load Database Markers Result To select a marker category ```tcl gui::select_marker_category category ``` #### Options | Switch Name | Description | |---------------|---------------------------| | `category` | Database marker category. | ### Show GUI To open the GUI from the command-line (this command does not return until the GUI is closed): ```tcl gui::show script interactive ``` #### Options | Switch Name | Description | |---------------|---------------------------------------------------------------------------------------------------------------------------------------------------------| | `script` | TCL script to evaluate in the GUI. | | `interactive` | Boolean if true, the GUI should open in an interactive session (default), or if false that the GUI would execute the script and return to the terminal. | ### Set GUI Title To set the title of the main GUI window: ```tcl gui::set_title title ``` #### Options | Switch Name | Description | |---------------|---------------------------------------------| | `title` | window title to use for the main GUI window | ### Hide GUI To close the GUI and return to the command-line: ```tcl gui::hide ``` ### Minimize the GUI To minimize the GUI window to an icon: ```tcl gui::minimize ``` ### Unminimize the GUI To unminimize the GUI window from an icon: ```tcl gui::unminimize ``` ### Layout Fit To fit the whole layout in the window: ```tcl gui::fit ``` ### Zoom to a specific region To zoom in our out to a specific region: ```tcl gui::zoom_to x0 y0 x1 y1 ``` #### Options | Switch Name | Description | |------------------|--------------------------------------------------------| | `x0, y0, x1, y1` | first and second corner of the layout area in microns. | ### Zoom In To zoom in the layout: ```tcl gui::zoom_in x y ``` #### Options | Switch Name | Description | |---------------|----------------------------------| | `x, y` | new center of layout in microns. | ### Zoom Out To zoom out the layout: ```tcl gui::zoom_out x y ``` #### Options | Switch Name | Description | |---------------|----------------------------------| | `x, y` | new center of layout in microns. | ### Center At To move the layout to new area: ```tcl gui::center_at x y ``` #### Options | Switch Name | Description | |---------------|----------------------------------| | `x, y` | new center of layout in microns. | ### Set Resolution To change the resolution to a specific value: ```tcl gui::set_resolution resolution ``` #### Options | Switch Name | Description | |---------------|---------------------------| | `resolution` | database units per pixel. | ### Add a single net to selection To add a single net to the selected items: ```tcl gui::selection_add_net name ``` #### Options | Switch Name | Description | |---------------|-------------------------| | `name` | name of the net to add. | ### Add multiple nets to selection To add several nets to the selected items using a regex: ```tcl gui::selection_add_nets name_regex ``` #### Options | Switch Name | Description | |---------------|---------------------------------------------| | `name_regex` | regular expression of the net names to add. | ### Add a single inst to selection To add a single instance to the selected items: ```tcl gui::selection_add_inst name ``` #### Options | Switch Name | Description | |---------------|------------------------------| | `name` | name of the instance to add. | ### Add multiple insts to selection To add several instances to the selected items using a regex: ```tcl gui::selection_add_insts name_regex ``` #### Options | Switch Name | Description | |---------------|--------------------------------------------------| | `name_regex` | regular expression of the instance names to add. | ### Select at point or area To add items at a specific point or in an area: Example usage: ```default gui::select_at x y gui::select_at x y append gui::select_at x0 y0 x1 y1 gui::select_at x0 y0 x1 y1 append ``` ```tcl gui::select_at x0 y0 x1 y1 [append] Or gui::select_at x y [append] ``` #### Options | Switch Name | Description | |------------------|-------------------------------------------------------------------------------------------------------------------------------------------------| | `x, y` | point in the layout area in microns. | | `x0, y0, x1, y1` | first and second corner of the layout area in microns. | | `append` | if `true` (the default value) append the new selections to the current selection list, else replace the selection list with the new selections. | ### Select next item from selection To navigate through multiple selected items: Returns: current index of the selected item. ```tcl gui::select_next ``` ### Select previous item from selection To navigate through multiple selected items: Returns: current index of the selected item. ```tcl gui::select_previous ``` ### Clear Selection To clear the current set of selected items: ```tcl gui::clear_selections ``` ### Get Selection Property To get the properties for the current selection in the Inspector: ```tcl gui::get_selection_property name ``` #### Options | Switch Name | Description | |---------------|---------------------------------------------------------------------------------------------------------| | `name` | name of the property. For example, `Type` for object type or `bbox` for the bounding box of the object. | ### Animate Selection To animate the current selection in the Inspector: ```tcl gui::selection_animate [repeat] ``` #### Options | Switch Name | Description | |---------------|---------------------------------------------------------------------------------------------------------------------------------------------| | `repeat` | indicate how many times the animation should repeat, default value is 0 repeats. If the value is 0, the animation will repeat indefinitely. | ### Highlight Net To highlight a net: ```tcl gui::highlight_net name [highlight_group] ``` #### Options | Switch Name | Description | |-------------------|---------------------------------------------------------------------------------| | `name` | name of the net to highlight. | | `highlight_group` | group to add the highlighted net to, defaults to `0`, valid groups are `0 - 7`. | ### Highlight Instance To highlight an instance: ```tcl gui::highlight_inst name [highlight_group] ``` #### Options | Switch Name | Description | |-------------------|--------------------------------------------------------------------------------------| | `name` | name of the instance to highlight. | | `highlight_group` | group to add the highlighted instance to, defaults to `0`, valid groups are `0 - 7`. | ### Clear Highlight Groups To clear the highlight groups: ```tcl gui::clear_highlights [highlight_group] ``` #### Options | Switch Name | Description | |-------------------|-------------------------------------------------------------------------------------------| | `highlight_group` | group to clear, defaults to `0`, valid groups are `-1 - 7`. Use `-1` to clear all groups. | ### Add Ruler to Layout To add a ruler to the layout: 1. either press `k` and use the mouse to place it visually. To disable snapping for the ruler when adding, hold the `Ctrl` key, and to allow non-horizontal or vertical snapping when completing the ruler hold the `Shift` key. 2. or use the command: Returns: name of the newly created ruler. ```tcl gui::add_ruler x0 y0 x1 y1 [label] [name] [euclidian] ``` #### Options | Switch Name | Description | |------------------|-----------------------------------------------------| | `x0, y0, x1, y1` | first and second end point of the ruler in microns. | | `label` | text label for the ruler. | | `name` | name of the ruler. | | `euclidian` | `1` for euclidian ruler, and `0` for regular ruler. | ### Delete a single ruler To remove a single ruler: ```tcl gui::delete_ruler name ``` #### Options | Switch Name | Description | |---------------|--------------------| | `name` | name of the ruler. | ### Clear All Rulers To remove all the rulers: ```tcl gui::clear_rulers ``` ### Add Label to Layout To add a label to the layout use the following command: Returns: name of the newly created label. ```tcl add_label -position {x y} [-anchor anchor] [-color color] [-size size] [-name name] text ``` #### Options | Switch Name | Description | |---------------|-------------------------------------------------------------------| | `-position` | point of the label in microns. | | `-anchor` | anchor point for text, default is center. | | `-color` | color to use for the label, default is white. | | `size` | size of the label, default is determined by the default GUI font. | | `name` | name of the label, one will be generated if not provided. | | `text` | text for the label. | ### Delete a single label To remove a single label: ```tcl gui::delete_label name ``` #### Options | Switch Name | Description | |---------------|--------------------| | `name` | name of the label. | ### Clear All Labels To remove all the labels: ```tcl gui::clear_labels ``` ### Display help To display the help for a specific command or messasge. ```tcl gui::show_help cmd_msg ``` #### Options | Switch Name | Description | |---------------|------------------------| | `cmd_msg` | command or message ID. | ### Set Heatmap To control the settings in the heat maps: The currently availble heat maps are: - `Pin` - `Power` - `Routing` - `Placement` - `IRDrop` - `RUDY` [1](#rudy) These options can also be modified in the GUI by double-clicking the underlined display control for the heat map. ```tcl gui::set_heatmap name [option] [value] ``` #### Options | Switch Name | Description | |---------------|----------------------------------------------------------------------------------------------------| | `name` | is the name of the heatmap. | | `option` | is the name of the option to modify. If option is `rebuild` the map will be destroyed and rebuilt. | | `value` | is the new value for the specified option. This is not used when rebuilding map. | ### Dump Heatmap to file To save the raw data from the heat maps ins a comma separated value (CSV) format: ```tcl gui::dump_heatmap name filename ``` #### Options | Switch Name | Description | |---------------|----------------------------------------| | `name` | is the name of the heatmap. | | `filename` | path to the file to write the data to. | ### Clocktree Selection Select a clock in the clock viewer: ```tcl gui::select_clockviewer_clock name ``` #### Options | Switch Name | Description | |---------------|-------------------------| | `name` | name of clock to select | ### GUI Display Controls Control the visible and selected elements in the layout: ```tcl gui::set_display_controls name [display_type] [value] ``` #### Options | Switch Name | Description | |----------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------| | `name` | is the name of the control. For example, for the power nets option this would be `Signals/Power` or could be `Layers/*` to set the option for all the layers. | | `display_type` | is either `visible`, `selectable`, `color` | | `value` | is either `true` or `false` for `visible` or `selectable` or the name of the color | ### Check Display Controls To check the visibility or selectability of elements in the layout: ```tcl gui::check_display_controls name display_type ``` #### Options | Switch Name | Description | |----------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------| | `name` | is the name of the control. For example, for the power nets option this would be `Signals/Power` or could be `Layers/*` to set the option for all the layers. | | `display_type` | is either `visible` or `selectable` | ### Save Display Controls When performing a batch operation changing the display controls settings, the following command can be used to save the current state of the display controls. ```tcl gui::save_display_controls ``` ### Restore Display Controls This command restores display controls. ```tcl gui::restore_display_controls ``` ### Input Dialog To request user input via the GUI: Returns: a string with the input, or empty string if canceled. ```tcl gui::input_dialog title question ``` #### Options | Switch Name | Description | |---------------|----------------------------------------| | `title` | is the title of the input message box. | | `question` | is the text for the message box. | ### Pause script execution Pause the execution of the script: ```tcl gui::pause [timeout] ``` #### Options | Switch Name | Description | |---------------|---------------------------------------------------------------------------------------------------------------------| | `timeout` | is specified in milliseconds, if it is not provided the pause will last until the user presses the Continue button. | ### Show widget To open a specific layout widget: ```tcl gui::show_widget name ``` #### Options | Switch Name | Description | |---------------|------------------------------------------------------------------------------| | `name` | of the widget. For example, the display controls would be “Display Control”. | ### Hide widget To close a specific layout widget: ```tcl gui::hide_widget name ``` #### Options | Switch Name | Description | |---------------|------------------------------------------------------------------------------| | `name` | of the widget. For example, the display controls would be “Display Control”. | ### Select chart To select a specific chart in the charts widget: ```tcl gui::select_chart name ``` #### Options | Switch Name | Description | |---------------|----------------------------------------------| | `name` | of the chart. For example, “Endpoint Slack”. | ### Update timing report Update the paths in the Timing Report widget: ```tcl gui::update_timing_report ``` ### Show Worst Path Update the paths in the Timing Report widget and select the path with the worst slack: ```tcl gui::show_worst_path [-setup|-hold] ``` #### Options | Switch Name | Description | |---------------|-------------------------------------------------------| | `-setup` | Select the path with the worst setup slack (default). | | `-hold` | Select the path with the worst hold slack. | ### Clear Timing Path Clear the selected timing path in the Timing Report widget: ```tcl gui::clear_timing_path ``` ## GUI Features ### Clock Insertion Latency in Timing Reports In the Data Path Details and Capture Path Details views, pins whose Liberty cell defines `max_clock_tree_path` / `min_clock_tree_path` timing groups display the internal clock latency inline: ![Clock insertion annotation in Data Path Details](main/docs/images/timing_report_clk_insertion.png) To view this, run the MockArray example and look at reg2reg paths: ```default bazelisk run --//:platform=gui //test/orfs/mock-array:MockArray_4x4_base_synth gui_synth ``` ## License BSD 3-Clause License. See [LICENSE](../../LICENSE) file. --- * **[1]** RUDY means Rectangular Uniform wire DensitY, which can predict the routing density very rough and quickly. You can see this notion in [this paper](https://past.date-conference.com/proceedings-archive/2007/DATE07/PDFFILES/08.7_1.PDF) # README.html.md # Global Placement The global placement module in OpenROAD (`gpl`) is based on the open-source RePlAce tool, from the paper “Advancing Solution Quality and Routability Validation in Global Placement”. Features: - Analytic and nonlinear placement algorithm. Solves electrostatic force equations using Nesterov’s method. ([link](https://cseweb.ucsd.edu/~jlu/papers/eplace-todaes14/paper.pdf)) - Verified with various commercial technologies and research enablements using OpenDB (7/14/16/28/45/55/65nm). - Verified deterministic solution generation with various compilers and OS. - Supports Mixed-size placement mode. | ![image](main/src/gpl/doc/image/adaptec2.inf.gif) | ![image](main/src/gpl/doc/image/coyote_movie.gif) | |----------------------------------------------------------|-----------------------------------------------------| | Visualized examples from ISPD 2006 contest; adaptec2.inf | Real-world Design: Coyote (TSMC16 7.5T) | ## Commands #### NOTE - Parameters in square brackets `[-param param]` are optional. - Parameters without square brackets `-param2 param2` are required. ### Global Placement When using the `-timing_driven` flag, `gpl` does a virtual `repair_design` to find slacks and weight nets with low slack. It adjusts the worst slacks (modified with `-timing_driven_nets_percentage`) using a multiplier (modified with `-timing_driven_net_weight_max`). The multiplier is scaled from the full value for the worst slack, to 1.0 at the `timing_driven_nets_percentage` point. Use the `set_wire_rc` command to set resistance and capacitance of estimated wires used for timing. Timing-driven iterations are triggered based on a list of overflow threshold values. Each time the placer execution reaches these overflow values, the resizer is executed. This process can be costly in terms of runtime. The overflow values for recalculating weights can be modified with `-timing_driven_net_reweight_overflow`, you may use less overflow threshold values to decrease runtime, for example. You can also set an overflow value for `keep_resize_below_overflow`, when below that, the modifications made by the rsz tool are maintained (non-virtual `repair_design`). When the routability-driven option is enabled, each of its iterations will execute RUDY to provide an estimation of routing congestion. Congested tiles will have the area of their logic cells inflated to reduce routing congestion. The iterations will attempt to achieve the target RC (routing congestion) by comparing it to the final RC at each iteration. If the algorithm takes too long during routability-driven execution, consider raising the target RC value (`-routability_target_rc_metric`) to alleviate the constraints. The final RC value is calculated based on the weight coefficients. The algorithm will stop if the RC is not decreasing for three consecutive iterations. Initial-placement arguments - They begin with `-initial_place`. - `-initial_place_max_iter`, `-initial_place_max_fanout` Routability-driven arguments - They begin with `-routability`. - `-routability_target_rc_metric`, `-routability_snapshot_overflow`, `-routability_check_overflow`, `-routability_max_density`, `-routability_inflation_ratio_coef`, `-routability_max_inflation_ratio`, `-routability_rc_coefficients` Timing-driven arguments - They begin with `-timing_driven`. - `-timing_driven_net_reweight_overflow`, `-timing_driven_net_weight_max`, `-timing_driven_nets_percentage`, `keep_resize_below_overflow`, `-timing_driven_repair_timing`, `-timing_driven_repair_tns_end_percent` ```tcl global_placement [-skip_initial_place]\ [-force_center_initial_place]\ [-skip_nesterov_place]\ [-timing_driven]\ [-routability_driven]\ [-incremental]\ [-skip_io]\ [-bin_grid_count grid_count]\ [-density target_density]\ [-init_density_penalty init_density_penalty]\ [-init_wirelength_coef init_wirelength_coef]\ [-min_phi_coef min_phi_coef]\ [-max_phi_coef max_phi_coef]\ [-reference_hpwl reference_hpwl]\ [-overflow overflow]\ [-initial_place_max_iter initial_place_max_iter]\ [-initial_place_max_fanout initial_place_max_fanout]\ [-routability_use_grt]\ [-routability_target_rc_metric routability_target_rc_metric]\ [-routability_check_overflow routability_check_overflow]\ [-routability_snapshot_overflow routability_snapshot_overflow]\ [-routability_max_density routability_max_density]\ [-routability_inflation_ratio_coef routability_inflation_ratio_coef]\ [-routability_max_inflation_ratio routability_max_inflation_ratio]\ [-routability_rc_coefficients routability_rc_coefficients]\ [-keep_resize_below_overflow keep_resize_below_overflow]\ [-timing_driven_net_reweight_overflow timing_driven_net_reweight_overflow]\ [-timing_driven_net_weight_max timing_driven_net_weight_max]\ [-timing_driven_nets_percentage timing_driven_nets_percentage]\ [-timing_driven_repair_timing]\ [-timing_driven_repair_tns_end_percent timing_driven_repair_tns_end_percent]\ [-pad_left pad_left]\ [-pad_right pad_right]\ [-disable_revert_if_diverge]\ [-disable_pin_density_adjust]\ [-enable_routing_congestion] ``` #### Options | Switch Name | Description | |-------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-timing_driven` | Enable timing-driven mode. See [link]() for timing-specific arguments. | | `-routability_driven` | Enable routability-driven mode. See [link]() for routability-specific arguments. | | `-skip_initial_place` | Skip the initial placement (Biconjugate gradient stabilized, or BiCGSTAB solving) before Nesterov placement. Initial placement improves HPWL by ~5% on large designs. Equivalent to `-initial_place_max_iter 0`. | | `-skip_nesterov_place` | Skip the nesterov placement. | | `-force_center_initial_place` | Initiate instances at the center of the core (or region) before initial placement, even if they already have a valid ODB location. By default, the placer will use the existing ODB locations if available. | | `-incremental` | Enable the incremental global placement. Users would need to tune other parameters (e.g., `init_density_penalty`) with pre-placed solutions. | | `-bin_grid_count` | Set bin grid’s counts. The internal heuristic defines the default value. Allowed values are integers `[64,128,256,512,...]`. | | `-density` | Set target density. The default value is `0.7` (i.e., 70%). Allowed values are floats `[0, 1]`. | | `-init_density_penalty` | Set initial density penalty. The default value is `8e-5`. Allowed values are floats `[1e-6, 1e6]`. | | `-init_wirelength_coef` | Set initial wirelength coefficient. The default value is `0.25`. Allowed values are floats. | | `-min_phi_coef` | Set `pcof_min` ($\mu_k$ Lower Bound). The default value is `0.95`. Allowed values are positive floats. Recommended values are in the range `[0.95, 1.05]`. | | `-max_phi_coef` | Set `pcof_max` ($\mu_k$ Upper Bound). Default value is `1.05`. Allowed values are positive floats. Recommended values are in the range `[1.00-1.20, float]`. | | `-reference_hpwl` | Set $\Delta HPWL_{ref}$. Default value is `466e6`. Allowed values are positive floats. See Eq. 36 in [ePlace](https://cseweb.ucsd.edu/~jlu/papers/eplace-todaes14/paper.pdf) | | `-overflow` | Set target overflow for termination condition. The default value is `0.1`. Allowed values are floats `[0, 1]`. | | `-pad_left` | Set left padding in terms of number of sites. The default value is `0`, and the allowed values are integers `[0, MAX_INT]` | | `-pad_right` | Set right padding in terms of number of sites. The default value is `0`, and the allowed values are integers `[0, MAX_INT]` | | `-skip_io` | Flag to ignore the IO ports when computing wirelength during placement. The default value is False, allowed values are boolean. | | `-disable_revert_if_diverge` | Flag to make gpl store the placement state along iterations, if a divergence is detected, gpl reverts to the snapshot state. The default value is disabled. | | `-disable_pin_density_adjust` | Flag to disable instance pin density area adjustment. The pin density area adjustment is enabled by default. | | `-enable_routing_congestion` | Flag to run global routing after global placement, enabling the Routing Congestion Heatmap. | #### Initial-Placement Arguments | Switch Name | Description | |-----------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-initial_place_max_iter` | Set maximum iterations in the initial place. The default value is `20`. Allowed values are integers `[0, MAX_INT]`. | | `-initial_place_max_fanout` | Set net escape condition in initial place when $fanout \geq initial\_place\_max\_fanout$. The default value is 200. Allowed values are integers `[1, MAX_INT]`. | #### Routability-Driven Arguments | Switch Name | Description | |-------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-routability_use_grt` | Use this tag to execute routability using FastRoute from grt for routing congestion, which is more precise but has a high runtime cost. By default, routability mode uses RUDY, which is faster. | | `-routability_target_rc_metric` | Set target RC metric for routability mode. The algorithm will try to reach this RC value. The default value is `1.01`, and the allowed values are floats. | | `-routability_snapshot_overflow` | Set the overflow threshold for saving a snapshot during routability-driven placement. The default value is `0.6` and the allowed values are floats `[0, 1]`. | | `-routability_check_overflow` | Set overflow threshold for routability mode. The default value is `0.3`, and the allowed values are floats `[0, 1]`. | | `-routability_max_density` | Set density threshold for routability mode. The default value is `0.99`, and the allowed values are floats `[0, 1]`. | | `-routability_inflation_ratio_coef` | Set inflation ratio coefficient for routability mode. The default value is `2`, and the allowed values are floats. | | `-routability_max_inflation_ratio` | Set inflation ratio threshold for routability mode to prevent overly aggressive adjustments. The default value is `3`, and the allowed values are floats. | | `-routability_rc_coefficients` | Set routability RC coefficients for calculating the averate routing congestion. They relate to the 0.5%, 1%, 2%, and 5% most congested tiles. It comes in the form of a Tcl List `{k1, k2, k3, k4}`. The default value for each coefficient is `{1.0, 1.0, 0.0, 0.0}` respectively, and the allowed values are floats. | #### Timing-Driven Arguments | Switch Name | Description | |-----------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-timing_driven_net_reweight_overflow` | Set overflow threshold for timing-driven net reweighting. Allowed value is a Tcl list of integers where each number is `[0, 100]`. Default values are [64, 20] | | `-timing_driven_net_weight_max` | Set the multiplier for the most timing-critical nets. The default value is `5`, and the allowed values are floats. | | `-timing_driven_nets_percentage` | Set the reweighted percentage of nets in timing-driven mode. The default value is 10. Allowed values are floats `[0, 100]`. | | `-keep_resize_below_overflow` | When the overflow is below the value, timing-driven iterations will retain (non-virtual) the resizer changes instead of reverting them (virtual). The default value is `1.0`, making all timing-driven iterations non-virtual. Allowed values are floats `[0, 1]`. | | `-timing_driven_repair_timing` | **Experimental.** Enable a conservative `repair_setup` pass during last timing-driven iteration. The intent is to apply minimal buffering and gate sizing so that the placement better correlates with global routing timing. Only the worst setup violators are targeted. Disruptive operations (pin swap, gate cloning, VT swap) are suppressed to avoid topology changes during placement. Not ready for production use. | | `-timing_driven_repair_tns_end_percent` | **Experimental.** When `-timing_driven_repair_timing` is enabled, controls the percentage of violating endpoints targeted by the `repair_setup` call. The default value is `1.0` and the allowed values are floats `[0, 100]`. | ### Cluster Flops This command does flop clustering based on parameters. ```tcl cluster_flops [-tray_weight tray_weight]\ [-timing_weight timing_weight]\ [-max_split_size max_split_size]\ [-num_paths num_paths] ``` #### Options | Switch Name | Description | |-------------------|---------------------------------------------------------------------------------| | `-tray_weight` | Tray weight, default value is 32.0, type `float`. | | `-timing_weight` | Timing weight, default value is 0.1, type `float`. | | `-max_split_size` | Maximum split size, default value is 500 (-1 for no decomposition), type `int`. | | `-num_paths` | KIV, default value is 0, type `int`. | ### Placement Clusters This command defines instances that should be placed as a single cluster. It is intended for use with small clusters of gates. ```tcl placement_cluster instance_patterns ``` ### Debug Mode The `global_placement_debug` command initiates a debug mode, enabling real-time visualization of the algorithm’s progress on the layout. Use the command prior to executing the `global_placement` command, for example on ORFS `flow/scripts/global_place.tcl` script. ```tcl global_placement_debug [-pause pause] [-update update] [-inst inst] [-start_iter start_iter] [-start_rudy start_rudy] [-rudy_stride rudy_stride] [-images_path images_path] [-draw_bins] [-initial] [-generate_images] ``` #### Options | Switch Name | Description | |--------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-pause` | Number of iterations between pauses during debugging. Allows for visualization of the current state. Allowed values are integers, default is `10`. | | `-update` | Defines the frequency (in iterations) at which the tool refreshes its layout output to display the latest state during debugging. Allowed values are integers, default is `10`. | | `-inst` | Targets a specific instance name for debugging focus. The default behavior focuses on no specific instance. | | `-start_iter` | Start debug mode from this iteration. | | `-start_rudy` | Start RUDY debug from this iteration. | | `-rudy_stride` | Stride for RUDY debug iterations. Allowed values are integers, default is `1`. | | `-images_path` | Path for saving generated images. | | `-draw_bins` | Activates visualization of placement bins, showcasing their density (indicated by the shade of white) and the direction of forces acting on them (depicted in red). The default setting is disabled. | | `-initial` | Pauses the debug process during the initial placement phase. The default setting is disabled. | | `-generate_images` | Generates a GIF animation showing the placement progression and a GIF composed of images right before each routability revert. Also saves snapshot images at the end of each routability and timing-driven iteration, including heatmaps. | Example: `global_placement_debug -pause 100 -update 1 -initial -draw_bins -inst _614_` This command configures the debugger to pause every 100 iterations, with layout updates occurring every iteration. It enables initial placement stage visualization, bin drawing, and specifically highlights instance 614. Debug mode requires the GUI. With ORFS, one way to arrange for showing the GUI when running the global placement step is by using `make global_place_issue` and then editing the created run-me.sh file to include the `-gui` flag when calling openroad. ## Useful Developer Commands If you are a developer, you might find these useful. More details can be found in the [source file](./src/replace.cpp) or the [swig file](./src/replace.i). ```default # adds padding and gets global placement uniform target density get_global_placement_uniform_density -pad_left -pad_right ``` Example scripts demonstrating how to run `gpl` on a sample design on `core01` as follows: ```shell ./test/core01.tcl ``` ## Regression tests There are a set of regression tests in `./test`. For more information, refer to this [section](../../README.md#regression-tests). Simply run the following script: ```shell ./test/regression ``` ## Limitations ## Using the Python interface to gpl This API tries to stay close to the API defined in `C++` class `Replace` that is located [here](include/gpl/Replace.h). When initializing a design, a sequence of Python commands might look like the following: ```python from openroad import Design, Tech tech = Tech() tech.readLef(...) design = Design(tech) design.readDef(...) gpl = design.getReplace() ``` Here is an example of some options / configurations to the global placer. (See [Replace.h](include/gpl/Replace.h) for a complete list) ```python gpl.setInitialPlaceMaxIter(iter) gpl.setSkipIoMode(skip_io) gpl.setTimingDrivenMode(timing_driven) gpl.setTimingNetWeightMax(weight) ``` There are some useful Python functions located in the file [grt_aux.py]() but these are not considered a part of the *final* API and they may change. ## FAQs Check out [GitHub discussion](https://github.com/The-OpenROAD-Project/OpenROAD/discussions/categories/q-a?discussions_q=category%3AQ%26A+replace+in%3Atitle) about this tool. ## References - C.-K. Cheng, A. B. Kahng, I. Kang and L. Wang, “RePlAce: Advancing Solution Quality and Routability Validation in Global Placement”, IEEE Transactions on Computer-Aided Design of Integrated Circuits and Systems, 38(9) (2019), pp. 1717-1730. [(.pdf)](https://vlsicad.ucsd.edu/Publications/Journals/j126.pdf) - J. Lu, P. Chen, C.-C. Chang, L. Sha, D. J.-H. Huang, C.-C. Teng and C.-K. Cheng, “ePlace: Electrostatics based Placement using Fast Fourier Transform and Nesterov’s Method”, ACM TODAES 20(2) (2015), article 17. [(.pdf)](https://cseweb.ucsd.edu/~jlu/papers/eplace-todaes14/paper.pdf) - J. Lu, H. Zhuang, P. Chen, H. Chang, C.-C. Chang, Y.-C. Wong, L. Sha, D. J.-H. Huang, Y. Luo, C.-C. Teng and C.-K. Cheng, “ePlace-MS: Electrostatics based Placement for Mixed-Size Circuits”, IEEE TCAD 34(5) (2015), pp. 685-698. [(.pdf)](https://cseweb.ucsd.edu/~jlu/papers/eplace-ms-tcad14/paper.pdf) - A. B. Kahng, J. Li and L. Wang,
\\\\ “Improved Flop Tray-Based Design Implementation for Power Reduction”,
\\\\ IEEE/ACM ICCAD, 2016, pp. 20:1-20:8. - A. B. Kahng, S. Kundu, S. Thumathy,
\\\\ “Scalable Flip-Flop Clustering Using Divide and Conquer For Capacitated K-Means”.
\\\\ ACM GLSVLSI, 2024, pp. 177-184.[(.pdf)](https://vlsicad.ucsd.edu/Publications/Conferences/409/c409.pdf) - The timing-driven mode has been implemented by Mingyu Woo (only available in [legacy repo in standalone branch](https://github.com/The-OpenROAD-Project/RePlAce/tree/standalone).) - The routability-driven mode has been implemented by Mingyu Woo. - Timing-driven mode re-implementation is ongoing with the current clean-code structure. - RUDY: Spindler, Peter, and Frank M. Johannes. “Fast and accurate routing demand estimation for efficient routability-driven placement. In 2007 Design, Automation & Test in Europe Conference & Exhibition.” (2007): 1-6. [(.pdf)](https://past.date-conference.com/proceedings-archive/2007/DATE07/PDFFILES/08.7_1.PDF) ## Authors - Authors/maintainer since Jan 2020: Mingyu Woo (Ph.D. Advisor: Andrew. B. Kahng) - Original open-sourcing of RePlAce: August 2018, by Ilgweon Kang (Ph.D. Advisor: Chung-Kuan Cheng), Lutong Wang (Ph.D. Advisor: Andrew B. Kahng), and Mingyu Woo (Ph.D. Advisor: Andrew B. Kahng). - Also thanks to Dr. Jingwei Lu for open-sourcing the previous ePlace-MS/ePlace project code. ## License BSD 3-Clause License. See [LICENSE](../../LICENSE) file. # README.html.md # Utilities The utility module contains the `man` command. ## Commands #### NOTE - Parameters in square brackets `[-param param]` are optional. - Parameters without square brackets `-param2 param2` are required. ### Prometheus Metrics OpenROAD includes a metrics endpoint server that can track internal tool metrics over time. ![page](docs/images/grafana.png) To use this feature you need to do the following start the prometheus and grafana collectors [Detailed instructions](): ```shell $ cd etc/monitoring $ docker compose up -d ``` This will start a grafana endpoint ready to collect from the OpenROAD application you would like to track. By default it’s looking for an http server running on port 8080 on your localhost. To start the metrics endpoint in OpenROAD, run: ```tcl utl::startPrometheusEndpoint 8080 ``` This is all configurable in the docker compose file, and you should be able to access grafana by going to http://localhost:3000 username: admin, password: grafana. Go to the dashboard tab and click service, then OpenROAD to see the pre-made dashboard. ## Man installation The `man` command can be installed optionally as part of the OpenROAD binary. For more instructions, please refer to [here](manREADME.md). ### Man The `man` command in OpenROAD is similar in functionality to Unix (and Unix-like operating systems such as Linux) . It is used to display the manual pages for various applications, tools and error messages. These manual pages provide detailed information about how to use a particular command or function, along with its syntax and options. This can be used for a range of commands in different levels as follows: - Level 1: Top-level openroad command (e.g. `man openroad`) - Level 2: Individual module commands (e.g. `man clock_tree_synthesis`) - Level 3: Info, error, warning messages (e.g. `man CTS-0001`) ```tcl man name [-manpath manpath] [-no_pager] ``` #### Options | Switch Name | Description | |---------------|--------------------------------------------------------------------------------------------------------------------------------------| | `name` | Name of the command/message to query. | | `-manpath` | Include optional path to man pages (e.g. ~/OpenROAD/docs/cat). | | `-no_pager` | This flag determines whether you wish to see all of the man output at once. Default value is `False`, which shows a buffered output. | ## Example scripts You may run various commands or message IDs for man pages. ```default man openroad man clock_tree_synthesis man CTS-0005 ``` ### tee Redirect a commands output to a file and standard out. ```tcl tee (-file filename | -variable name) [-append] [-quiet] command ``` #### Options | Switch Name | Description | |------------------|-------------------------------------| | `-file filename` | File to redirect output into. | | `-variable name` | Direct output into a variable. | | `-append` | Append to file. | | `-quiet` | Do not send output to standard out. | | `command` | Command to execute. | ## Example scripts ```default tee -file output.rpt { report_design_area } tee -quiet -file output.rpt { report_floating_nets } ``` ## Regression tests There are a set of regression tests in `./test`. For more information, refer to this [section](../../README.md#regression-tests). For information regarding the Man page test framework, refer to this link. You should also be aware of the README and Tcl format enforced to ensure accurate parsing of man pages. Simply run the following script: ```shell ./test/regression ``` ## Limitations ## FAQs Check out [GitHub discussion](https://github.com/The-OpenROAD-Project/OpenROAD/discussions/categories/q-a?discussions_q=category%3AQ%26A+utl) about this tool. ## References ## Authors MAN command is written by Jack Luar with guidance from members of the OpenROAD team, including: Cho Moon, Matt Liberty. ## License BSD 3-Clause License. See [LICENSE](../../LICENSE) file. # README.html.md # OpenDB The OpenDB (`odb`) module in OpenROAD is a design database to support tools for physical chip design. It was originally developed by Athena Design Systems. Nefelus, Inc. acquired the rights to the code and open-sourced it with BSD-3 license in 2019 to support the DARPA OpenROAD project. The structure of OpenDB is based on the text file formats LEF (library) and DEF (design) formats version 5.6. OpenDB supports a binary file format to save and load the design much faster than using LEF and DEF. OpenDB is written in C++ 98 with standard library style iterators. The classes are designed to be fast enough to base an application on without having to copy them into application-specific structures. ## Commands #### NOTE - Parameters in square brackets `[-param param]` are optional. - Parameters without square brackets `-param2 param2` are required. ## Directory structure ```default include/odb/db.h - public header for all database classes src/db - private/internal database representations src/lefin - LEF reader src/lefout - LEF writer src/defin - DEF reader src/defout - DEF writer ``` ## Database API We are still working on documenting the APIs. We have over 1,800 objects and functions that we are still documenting (for both TCL and Python). **Contributions are very welcome in this effort**. Find starting points below. ## Python After building successfully, run `openroad -python` to enable the Python interpreter. You can find examples on using the API from Python under `test/python/` directory. To list the full set of the Python classes exposed run `openroad -python` then: ```default import openroad import odb print(', '.join(dir(openroad))) print(', '.join(dir(odb))) ``` ## C++ All public database classes are defined in `db.h`. These class definitions provide all functions for examining and modifying the database objects. The database is an object itself, so multiple database objects can exist simultaneously (no global state). `dbTypes.h` defines types returned by database class member functions. All database objects are in the `odb` namespace. - `dbChip` - `dbBlock` - `dbTech` - `dbLib` All database objects have a 32bit object identifier accessed with the `dbObject::getOID` base class member function that returns a `uint32_t`. This identifier is preserved across save/restores of the database so it should be used to reference database object by data structures instead of pointers if the reference lifetime is across database save/restores. OIDs allow the database to have exactly the same layout across save/restores. The database distance units are **nanometers** and use the type `uint32_t`. ### Create Physical Cluster Description TBC. ```tcl create_physical_cluster cluster_name ``` #### Options | Switch Name | Description | |----------------|------------------| | `cluster_name` | Name of cluster. | ### Create Child Physical Clusters Description TBC. ```tcl create_child_physical_clusters [-top_module] or create_child_physical_clusters [-modinst path] ``` #### Options | Switch Name | Description | |---------------|---------------| | `top_module` | TBC. | | `-modinst` | TBC. | ### Create NDR Description TBC. ```tcl create_ndr -name name [-spacing val] [-width val] [-via val] ``` #### Options | Switch Name | Description | |---------------|---------------| | `-name` | TBC. | | `-spacing` | TBC. | | `-width` | TBC. | | `-via` | TBC. | ### Set NDR Layer Rule This command sets a non-default rule (NDR) for a specific routing layer. ```tcl set_ndr_layer_rule tech ndr layerName input isSpacing ``` #### Options | Switch Name | Description | |---------------|--------------------------------------------------------------------------------| | `tech` | Technology database object. | | `ndr` | NDR database object to apply the rule to. | | `layerName` | Name of the routing layer. | | `input` | Spacing or width value (absolute in microns, or multiplier using `*N` syntax). | | `isSpacing` | Boolean — `1` to set spacing, `0` to set width. | ### Set NDR Rules This command sets non-default rules for spacing or width across all or a range of routing layers. ```tcl set_ndr_rules tech ndr values isSpacing ``` #### Options | Switch Name | Description | |---------------|--------------------------------------------------------------------------| | `tech` | Technology database object. | | `ndr` | NDR database object to apply the rules to. | | `values` | Single value (applied to all layers) or a list of `{layer value}` pairs. | | `isSpacing` | Boolean — `1` to set spacing, `0` to set width. | ### Create Voltage Domain Description TBC. ```tcl create_voltage_domain domain_name -area {llx lly urx ury} ``` #### Options | Switch Name | Description | |----------------|---------------| | `-domain_name` | TBC. | | `-area` | TBC. | ### Delete Physical Cluster Description TBC. ```tcl delete_physical_cluster cluster_name ``` #### Options | Switch Name | Description | |----------------|---------------| | `cluster_name` | TBC. | ### Delete Voltage Domain Description TBC. ```tcl delete_voltage_domain domain_name ``` #### Options | Switch Name | Description | |---------------|---------------| | `domain_name` | TBC. | ### Assign Power Net Description TBC. ```tcl assign_power_net -domain domain_name -net snet_name ``` #### Options | Switch Name | Description | |----------------|---------------| | `-domain_name` | TBC. | | `-net` | TBC. | ### Assign Ground Net Description TBC. ```tcl assign_ground_net -domain domain_name -net snet_name ``` #### Options | Switch Name | Description | |----------------|---------------| | `-domain_name` | TBC. | | `-net` | TBC. | ### Add to Physical Cluster Description TBC. ```tcl add_to_physical_cluster [-modinst path] cluster_name or add_to_physical_cluster [-inst inst_name] cluster_name or add_to_physical_cluster [-physical_cluster cluster_name] cluster_name ``` #### Options | Switch Name | Description | |---------------------|---------------| | `-modinst` | TBC. | | `-inst` | TBC. | | `-physical_cluster` | TBC. | | `cluster_name` | TBC. | ### Remove From Physical Cluster Description TBC. ```tcl remove_from_physical_cluster [-parent_module module_name] [-modinst modinst_name] cluster_name or remove_from_physical_cluster [-inst inst_name] cluster_name or remove_from_physical_cluster [-physical_cluster cluster_name] cluster_name ``` #### Options | Switch Name | Description | |---------------------|---------------| | `-parent_module` | TBC. | | `-modinst` | TBC. | | `-inst` | TBC. | | `-physical_cluster` | TBC. | | `-cluster_name` | TBC. | ### Report Physical Clusters Description TBC. ```tcl report_physical_clusters ``` ### Report Voltage Domains Description TBC. ```tcl report_voltage_domains ``` ### Report Group Description TBC. ```tcl report_group group ``` #### Options | Switch Name | Description | |---------------|---------------| | `group` | TBC. | ### Write Guides This command writes global routing guides, which can be used as input for global routing. Example: `write_guides route.guide`. ```tcl write_guides file_name ``` #### Options | Switch Name | Description | |---------------|------------------| | `file_name` | Guide file name. | ### Write Macro Placement This command writes macro placement. ```tcl write_macro_placement file_name ``` #### Options | Switch Name | Description | |---------------|----------------------------| | `file_name` | Macro placement file name. | ### Design Is Routed This command checks if the design is completely routed. ```tcl design_is_routed [-verbose] ``` #### Options | Switch Name | Description | |---------------|-----------------------------------------------------------------------| | `verbose` | Flag that allow the command to show all the nets that are not routed. | ### Create Blockage This command provides a unified interface for creating placement blockages. The command supports hard, soft, and partial blockages with flexible configuration options. ```tcl create_blockage -region {x1 y1 x2 y2} [-inst instance] [-max_density density] [-soft] ``` #### Options | Switch Name | Description | |---------------|---------------------------------------------------------------------------| | `region` | (required) Blockage coordinates in microns. For example, {0 0 10 10} | | `inst` | (optional): Associate blockage with a specific instance. | | `max_density` | (optional): Maximum density for partial blockages (0-100). | | `soft` | (optional): Create a soft blockage only blocked during initial placement. | ### Create Routing Obstruction This command provides a unified interface for creating routing blockages. ```tcl create_obstruction -region {x1 y1 x2 y2} -layer layer [-inst instance] [-slot] [-fill] [-except_pg] [-min_spacing space] [-effective_width width] ``` #### Options | Switch Name | Description | |-------------------|-------------------------------------------------------------------------| | `region` | (required) Obstruction coordinates in microns. For example, {0 0 10 10} | | `layer` | (required) Layer to apply the obstruction on. | | `inst` | (optional): Associate obstruction with a specific instance. | | `slot` | (optional): Mark as a slot obstruction. | | `fill` | (optional): Mark as a fill obstruction. | | `min_spacing` | (optional): Add a minimum spacing to the obstruction. | | `effective_width` | (optional): Add an effective width to the obstruction. | ## Example scripts After building successfully, run OpenDB Tcl shell using `../../build/src/odb/src/swig/tcl/odbtcl`. An example usage: ```default set db [dbDatabase_create] set lef_parser [new_lefin $db true] set tech [lefin_createTech $lef_parser ./src/odb/test/data/gscl45nm.lef] ``` You can find examples on using the API from Tcl under `test/tcl/` directory. The full set of the Tcl commands exposed can be found under `./build/src/swig/tcl/opendb_wrapper.cpp`. Search for `SWIG_prefix`. ### All pin placed This command checks if the IO pins of the design have a placement status of `PLACED`, `LOCKED`, `FIRM`, or `COVER`. Return `1` if true, and `0` if false. ```tcl all_pins_placed ``` ### Add 3DBlox Alignment Marker Rule This command registers a 3DBlox alignment marker rule between two cell masters. The 3DBlox checker uses these rules to verify that paired alignment marker instances on bonded chiplets are co-located and (optionally) match a relative orientation constraint. ```tcl add_3dblox_alignment_marker_rule [-lib_a lib_a] -master_a master_a [-lib_b lib_b] -master_b master_b [-tolerance tolerance_um] [-relative_orientations relative_orientations] ``` #### Options | Switch Name | Description | |--------------------------|----------------------------------------------------------------------------------------------------------------------------------------------| | `-lib_a` | Optional library to scope `-master_a` lookup. Required only when the master name is ambiguous across libraries. | | `-master_a` | Cell master used as side A of the alignment pair. | | `-lib_b` | Optional library to scope `-master_b` lookup. | | `-master_b` | Cell master used as side B of the alignment pair. | | `-tolerance` | Maximum allowed center-to-center misalignment in microns. Must be positive. Defaults to 0 (exact alignment required). | | `-relative_orientations` | Optional Tcl list of allowed orientations of master_b relative to master_a (e.g. `{R0 MY}`). When omitted, orientations are not constrained. | ## Regression tests There are a set of regression tests in `./test`. For more information, refer to this [section](../../README.md#regression-tests). Simply run the following script: ```shell ./test/regression ``` ## Database Internals The internal description included here is paraphrased from Lukas van Ginneken by James Cherry. The database separates the implementation from the interface, and as a result, each class becomes two classes, a public one and a private one. For instance, `dbInst` has the public API functions, while class `_dbInst` has the private data fields. The objects are allocated in dynamically resizable tables, the implementation of which is in `dbTable.hpp`. Each table consists of a number of pages, each containing 128 objects. The table contains the body of the `struct`, not a set of pointers. This eliminates most of the pointer overhead while iteration is accomplished by stepping through the table. Thus, grouping these objects does not require a doubly-linked list and saves 16 bytes per object (at the cost of some table overhead). Each object has an id, which is the index into the table. The lowest 7 bits are the index in the page, while the higher bits are the page number. Object id’s are persistent when saving and reading the data model to disk, even as pointer addresses may change. Everything in the data model can be stored on disk and restored from disk exactly the way it was. An extensive set of equality tests and diff functions make it possible to check for even the smallest deviation. The capability to save an exact copy of the state of the system makes it possible to create a checkpoint. This is a necessary capability for debugging complex systems. The code follows the definition of LEF and DEF closely and reflects many of the idiosyncrasies of LEF and DEF. The code defines many types of objects to reflect LEF and DEF constructs although it sometimes uses different terminology, for instance, the object to represent a library cell is called `dbMaster` while the LEF keyword is MACRO. The data model supports the EEQ and LEQ keywords (i.e., electrically equivalent and logically equivalent Masters), which could be useful for sizing. However, it does not support any logic function representation. In general, there is very limited support for synthesis-specific information: no way to represent busses, no way to represent logic function, very limited understanding of signal flow, limited support of timing information, and no support for high level synthesis or test insertion. The db represents routing as in DEF, representing a trace from point to point with a given width. The layout for a net is stored in a class named `dbWire` and it requires a special `dbWireDecoder` (which works like an iterator) to unpack the data and another `dbWireEncoder` to pack it. The data model does not support a region query and objects that are in the same layer are scattered about the data model and are of different classes. This means that whatever tool is using the layout information will have to build its own data structures that are suitable to the layout operations of that tool. For instance, the router, the extractor, and the DRC engine would each have to build their unique data structures. This encourages batch mode operation (route the whole chip, extract the whole chip, run DRC on the whole chip). ## Limitations ## FAQs Check out [GitHub discussion](https://github.com/The-OpenROAD-Project/OpenROAD/discussions/categories/q-a?discussions_q=category%3AQ%26A+odb+in%3Atitle) about this tool. ## LICENSE BSD 3-Clause License. See [LICENSE](../../LICENSE) file. # README.html.md # Python Unit Tests ## Running tests For running the python unit tests you will need to install first *testtools* and *unittest-parallel* which enables concurrent unit testing ```shell pip3 install testtools pip3 install unittest-parallel ``` Then, you can run the unit tests in sequence by running ```shell ../unitTests.sh ``` or in parallel by running ```shell ../unitTests.sh parallel ``` **Note**: The test cases within each Unit Test run in parallel in both situations --- ## Tests Structure The directory unitTestsPython includes unit tests for OpenDB Python APIs. Any test file starts with ‘Test’ followed by the test target. ### odbUnitTest.py: This includes `TestCase` class which inherits from `unittest.TestCase` with additional functionalities: * `changeAndTest(self,obj,SetterName,GetterName,expectedVal,*args)`which is a function for changing a value and testing for the effect of that change where: * `obj` is the object to be tested * `SetterName` is the name of the function to be called for changing a value * `GetterName` is the name of the function to be called for testing the effect * `expectedVal` is the expected value for the testing * `*args` are the arguments passed to the `SetterName` function So, in the end, the expected behavior is: ```python obj.SetterName(*args) assert(obj.GetterName()==expectedVal) ``` * `check(self,obj,GetterName,expectedVal,*args)` which tests against expected value * `change(self,obj,SetterName,*args)` which changes a value in the object * `main()` runs the `TestCase` in sequential order * `mainParallel(Test)` runs the passed `Test` class in parallel ### helper.py: A set of functions for creating simple db instances to be used for testing. You can find the description of each function in the comments ### TestNet.py: Unit test class for testing dbNet. It inherits from `odbUnitTest.TestCase` . it consists of * `setUp(self)` function to be called before each test case. Here, we create the database with the desired chip, block, masters, instances and nets. * `tearDown(self)` function to be called after each test case. Here, we destroy our db. * `test_*(self)` the test cases functions. Their names should start with `test` for the unittest suite to recognize. ### TestDestroy.py: Integration test class for testing the `destroy(*args)` function on OpenDB. * `test_destroy_net` destroying net and testing for the effect on the *block,inst, iterms and bterms* * `test_destroy_inst` destroying instance and testing for the effect on *block, iterms, net, bterms* * `test_destroy_bterm` destroying bterm and testing for the effect on *block and net* * `test_destroy_block` destroying block and testing for the effect on *block(parent and child relation), and chip* * `test_destroy_bpin` destroying bpin and testing for the effect on *bterm* * `test_create_destroy_wire` destroying wire and test for the effect on *net* * `test_destroy_capnode` destroying capnode and test for the effect on *net(node and connected ccsegs)* * `test_destroy_ccseg` destroying ccseg and test for the effect on *node,block and net* * `test_destroy_lib` destroying lib and test for the effect on *db* * `test_destroy_obstruction` destroying obstruction and test for the effect on *block* * `test_create_regions` creating regions and test for the effect on *block and region(parent and child relation)* * `test_destroy_region_child` destroying \_ and test for the effect on *block and region(parent)* * `test_destroy_region_parent` destroying \_ and test for the effect on *block* ### TestBlock.py: Unit Test for dbBlock * `test_find` testing the find function with *BTerm, Child, Inst, Net, ITerm, ExtCornerBlock, nonDefaultRule, Region* * Testing the ComputeBBox() function through the first call of getBBox: * `test_bbox0` testing empty block box * `test_bbox1` testing block box with Inst placed * `test_bbox2` testing block box with Inst and BPin placed * `test_bbox3` testing block box with Inst, BPin and Obstruction placed * `test_bbox3` testing block box with Inst, BPin, Obstruction and SWire placed ### TestBTerm.py: Unit Test for dbBTerm * `test_idle` testing for idle disconnected `BTerm` behavior * `test_connect` testing connect function of `BTerm` on `BTerm` and `Net` * `test_disconnect` testing disconnect function of `BTerm` on `BTerm` and `Net` ### TestInst.py: Unit Test for dbInst * `test_swap_master` testing swap master function ### TestITerm.py: Unit Test for dbITerm * `test_idle` testing for disconnected ITerm without a net * `test_connection_from_iterm` testing the connect(ITerm,…) and disconnect functions of ITerm and their effect on ITerm and Net * `test_connection_from_inst` testing the connect(Inst,…) and disconnect functions of ITerm and their effect on ITerm and Net * Testing for getAvgXY() function * `test_avgxy_R0` testing with default orientation R0 * `test_avgxy_R90` testing with different orientation R90 for transformation --- #### Problems Found In Testing * multiple core dumps that leads to aborting the process: * dbNet.get1st\*() (when nothing on top of the list) * childRegion.getParent() (after destroying the parent region) * Implementation of ComputeBBox() is flawed and needs to be reconsidered # README.html.md # ODB Code Generator This directory contains the code generator for OpenDB (`odb`) database objects. A large fraction of `odb`’s C++ — the public classes in `include/odb/db.h`, the private storage classes in `src/db/`, their serializers, comparators, memory accounting, and the object iterators — is generated from JSON schema files rather than written by hand. This document is for developers who maintain `odb` or the generator itself; it is **not** an end-user guide. ## Why a generator Every `odb` object follows the same boilerplate-heavy pattern: - a **public** class `dbFoo` (in `include/odb/db.h`) exposing getters/setters, - a **private** storage class `_dbFoo` (in `src/db/dbFoo.h`) holding the fields, - stream `operator>>` / `operator<<` for disk serialization, - `operator==` / `operator<` for diffing two databases, - `collectMemInfo()` for heap accounting, - constructor/destructor wiring for owned tables and `char*` strings, - registration in the `dbObjectType` enum and its hash maps, - one iterator class per parent→child table relationship. Writing this by hand is repetitive and easy to get subtly wrong (e.g. a field added to the struct but forgotten in the serializer, breaking on-disk compatibility). The generator derives all of it from a per-class description of the fields, so the only thing a developer writes by hand is the genuinely custom logic, kept in clearly marked **User Code** blocks (see [Section merging]()). ## Quick start ```shell # Regenerate every odb file in place (writes into ../db and ../../include/odb): ./generate # wrapper for: python3 gen.py # Keep the intermediate rendered files for inspection: python3 gen.py --keep_generated # leaves them in ./generated/ # Preserve empty User Code blocks (see "Adding to an empty section" below): python3 gen.py --keep_empty ``` The generator depends only on `jinja2` (CI pins `jinja2==3.1.6`) and `clang-format` (run on every generated C++ file). It must be run from this directory. > **CI invariant:** running `./generate` on a clean checkout must produce **no > git diff**. The workflow `.github/workflows/github-actions-are-odb-files-generated.yml` > fails the build otherwise. After editing any schema file, template, or the > generator itself, re-run `./generate` and commit the regenerated C++ alongside > your change. ## Pipeline overview `gen.py` drives four stages: ```default load_schema() read schema.json + every schema/**/*.json class file │ process_schema() derive everything the templates need: │ - expand relations into parent/child fields │ - classify every field into a FieldType "kind" │ - resolve accessor names, includes, forward decls │ - pack bitfields into a flags_ struct │ - compute operator==/< component lists │ - assign each class a stable dbObjectType hash │ generate() render Jinja templates into ./generated/ │ _merge_files() splice generated sections into the real source files, preserving hand-written User Code, then clang-format ``` ## Files in this directory | File | Role | |---------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `gen.py` | Entry point and orchestration. Loads the schema, runs all the derivation passes (`process_schema`), renders templates, and merges output into the tree. | | `schema_models.py` | Dataclasses (`Schema`, `Class`, `Field`, `Struct`, `Enum`, `Relation`, `Iterator`) that the JSON deserializes into. `from_dict` rejects unknown keys so JSON typos fail loudly. | | `field_types.py` | The `FieldType` hierarchy — the single source of truth for how a field’s C++ type is declared, serialized, compared, copied, and accessed. `make_field_type()` classifies a field into one kind. | | `helper.py` | Pure helper functions: type-string predicates (`is_ref`, `is_hash_table`, `is_set_by_ref`, …), name munging (pluralize, camel-case, table name), template-argument parsing, and the FNV-1a hash for object types. | | `parser.py` | The section merger. Knows how to find `Generator Code`/`User Code` regions in an existing file and splice new generated content in without losing hand-written code. | | `schema.json` | Top-level schema: `classes_dir`, the list of `iterators`, the list of `relations`, and `extern_enums`. | | `schema/**/*.json` | One file per database class (grouped into `chip/`, `tech/`, `gds/`, `scan/` subdirectories). | | `templates/*.jinja` | The Jinja2 templates that emit C++ / CMake. | | `test_*.py` | Unit tests (see [Testing]()). | | `generate` | Thin shell wrapper: `python3 gen.py`. | ## Schema format ### Top-level `schema.json` ```jsonc { "classes_dir": "schema", // directory scanned recursively for class files "extern_enums": ["dbGDSSTrans"], // enum types defined outside the generator; // treated as pass-by-value like other enums "iterators": [ ... ], // see "Iterators" "relations": [ ... ] // see "Relations" } ``` ### Per-class file (`schema/**/dbFoo.json`) ```jsonc { "name": "dbAccessPoint", // public class name; private class is _dbAccessPoint "type": "dbObject", // optional base class (default "dbObject") "description": ["A line ...", // optional doc-comment lines emitted above the "another line"], // public class in db.h "fields": [ ... ], // see "Fields" "structs": [ ... ], // optional nested structs (public or private) "enums": [ ... ], // optional nested enums (public or private) "h_includes": ["dbVector.h"], // extra headers for the generated .h "cpp_includes": ["odb/dbTypes.h"],// extra headers for the generated .cpp "do_not_generate_compare": false, // skip operator==/< (also drops the std::less<> in dbCompare.inc) "hash": "0x1234ABCD", // optional explicit object-type hash (default: FNV-1a of name) "ostream_scope": false, // wrap operator<< in a named dbOStreamScope "assert_alignment_is_multiple_of": null // emit a static_assert on alignof (pointer tagging) } ``` The set of accepted keys is exactly the dataclass fields in `schema_models.py`; an unknown key raises a `ValueError` naming the offending key. When adding a feature, add the key to the dataclass first. ### Fields A field describes one member of the private `_dbFoo` storage class and the accessors generated for it. Common keys: | Key | Meaning | |---------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `name` | C++ member name, conventionally trailing-underscore (`point_`). The setter argument and accessor names are derived from it. | | `type` | C++ type string. May be a scalar, enum, `std::*`, `Point`/`Rect`/…, `dbId<_dbX>` (object reference), `dbVector<...>`, `dbHashTable<...>`, or the pseudo-type `"bit"` (→ `bool` 1-bit field). | | `flags` | List of behavior flags — see [Flags](). | | `bits` | Bitfield width. Fields with `bits` are packed into a generated `flags_` struct. | | `default` | Initializer emitted in the constructor. | | `parent` | For a `dbId<_dbX>` reference, the class that owns the table the id resolves against. Required for the getter to do a table lookup. | | `comment` / `public_comment` | Comment emitted next to the member / next to the public getter. | | `argument` | Override the setter’s argument name (default: `name` without underscores). | | `setterFunctionName` / `getterFunctionName` | Override the derived accessor names (e.g. `getBPin`). | | `schema` | Guard serialization-in behind `isSchema()` for backward-compatible format upgrades. | | `table` / `page_size` / `dbSetGetter` | Set automatically for relation-generated table fields; not usually written by hand. | ### Field kinds (`field_types.py`) `make_field_type()` classifies each field’s `type` into exactly one `FieldType`, and the rest of the generator asks that object how to handle the field instead of re-parsing the type string. Classification precedence: | Kind | Matches | Accessor / behavior | |-----------------|---------------------------------------------|-------------------------------------------------------------------------------------------------------------------| | `TableType` | a relation’s owned `dbTable<_Child>*` | getter returns a `dbSet`; serialized/compared by dereference; constructed in the ctor, deleted in the dtor | | `RefType` | `dbId<_X>` **with** a `parent` | stores an OID; getter resolves it via the parent’s owner table; setter takes `X*` | | `HashTableType` | `dbHashTable<_X>` | exposes a `findX(name)` getter; no setter | | `BoolType` | a width-1 bitfield | accessor type is `bool` (`isFoo()` getter) | | `VectorType` | `dbVector<...>` / `std::vector<...>` | getter is an out-parameter (`void getFoo(std::vector<...>&)`); exposed as `std::vector` | | `CharPtrType` | `char*` | deep-copied; getter returns `const char*`; `name_` is freed in the dtor | | `StringType` | `std::string` | scalar-like, but set by const ref | | `PairType` | `std::pair<...>` | scalar-like, but set by const ref | | `ScalarType` | everything else (PODs, enums, `std::` tail) | by-value getter/setter | The `Field` properties the templates read (`setterArgumentType`, `getterReturnType`, `member_decl`, `isSetByRef`, `refTable`, …) are all delegated to the field’s `kind`. To change how a category of type is handled, edit the corresponding `FieldType` subclass rather than special-casing in the templates. ### Flags reference | Flag | Effect | |---------------|---------------------------------------------------------------------------------------------------------------------------------------------------------| | `private` | No getter and no setter (implies `no-get` + `no-set`). | | `no-get` | Don’t generate a getter. | | `no-set` | Don’t generate a setter. | | `no-serial` | Exclude from `operator>>` / `operator<<`. | | `no-cmp` | Exclude from `operator==`. | | `cmpgt` | Include in `operator<` (the ordering comparison). | | `no-meminfo` | Exclude from generated `collectMemInfo()` accounting (handle it in the User Code block — e.g. a vector of strings that needs element-level accounting). | | `no-template` | Don’t forward-declare the field’s template arguments. | | `no-destruct` | Don’t free a `char*` field in the destructor. | ### Relations A relation declares a 1-to-many ownership: a `parent` class owns a table of `child` objects. From one entry the generator synthesizes, on the parent, an owned `dbTable<_Child>*` field with a `dbSet` getter (and, for `hash` relations, a `dbHashTable` plus a `next_entry_` link on the child). ```jsonc { "parent": "dbTechLayer", "child": "dbTechLayerCutClassRule", "type": "1_n", // only 1_n is supported "tbl_name": "cut_class_rules_tbl_", // the generated table member name "hash": true, // also generate a name→child hash table "page_size": 1024, // optional dbTable page size "schema": "kSchemaFoo", // gate serialization for format upgrades "flags": ["no-serial"], // flags applied to the generated fields "create": true, // generate Child::create(Parent*) "destroy": true // generate Child::destroy(Child*) } ``` `create`/`destroy` emit the canonical owned-table factory methods on the child. Set them only when the hand-written `create`/`destroy` would do nothing more than allocate/free a table entry (and free properties on destroy); anything with extra logic must keep its hand-written versions in User Code. ### Iterators Each iterator entry generates a `dbIterator` subclass that walks a parent’s table: ```jsonc { "name": "dbModuleInstItr", "parentObject": "dbInst", // element type the iterator yields "tableName": "inst_tbl", // the table member it walks "reversible": "true", "orderReversed": "true", "sequential": 0, "customEnd": "true", // emit a User Code end() instead of "return 0" "tablePageSize": 1024, // must match the table's page size "flags": ["private"], "includes": ["dbModule.h"] // extra headers for the .cpp } ``` The `begin`, `next`, and (for `customEnd`) `end` bodies are left as User Code blocks for you to fill in — only the boilerplate around them is generated. ## Generated output `generate()` renders, then `_merge_files()` writes: - **Per class:** `_dbFoo` private header and `.cpp` (`impl.h.jinja`, `impl.cpp.jinja`) → `src/db/dbFoo.{h,cpp}`. The `.cpp` contains the serializers (`serializer_in/out.cpp.jinja`), comparators, constructor, destructor, `collectMemInfo`, and accessor definitions. - **Per iterator:** `dbFooItr.{h,cpp}` (`itr.h.jinja`, `itr.cpp.jinja`). - **Shared, schema-wide files:** - `db.h.jinja` → public class declarations/definitions in `include/odb/db.h`. - `dbObject.h.jinja` / `dbObject.cpp.jinja` → the `dbObjectType` enum entries and the hash↔type maps. - `dbCompare.inc.jinja` → deleted `std::less` specializations. - `CMakeLists.txt.jinja` → the generated-source list in `src/CMakeLists.txt`. Each class is assigned a stable `dbObjectType` hash (explicit `hash` key, else FNV-1a of the name); a collision between two classes is a hard error. ## Section merging (User Code vs generated code) Generated files are **not** wholesale-overwritten. Each managed file is divided into regions by paired comment markers: ```cpp // Generator Code Begin Cpp ... fully owned by the generator; replaced on every run ... // User Code Begin Constructor ... your hand-written code; preserved across runs ... // User Code End Constructor // Generator Code End Cpp ``` `parser.py` (`Parser`) implements the merge: 1. `parse_user_code()` — capture the current contents of every `User Code` block from the existing file. 2. `clean_code()` — strip the old generator-owned regions. 3. `parse_source_code()` — read the freshly rendered generator regions. 4. `write_in_file()` — splice the saved User Code back into the matching blocks inside the new generated regions, then write the file. Key consequences for developers: - **Put custom logic only inside `User Code` blocks.** Anything outside them is overwritten on the next `./generate`. - A `User Code` block whose name no longer exists in the regenerated output is a **hard error** (“User tags … not used”) — the generator refuses to silently drop your code. If you rename/remove a field whose User Code you still need, move that code first. - Empty `User Code` blocks are removed by default to keep files tidy. To add code to a section that is currently emitted as empty, regenerate with `--keep_empty`, fill in the block, then drop the flag and regenerate again. - `CMakeLists.txt` uses `#`-style markers; everything else uses `//`. - Files that don’t yet exist are simply copied out; existing files are merged. ## Testing ```shell python3 -m unittest test_schema_validation # schema typing: unknown-key rejection, bool coercion python3 -m unittest test_field_types # every field in the real schema gets a valid kind python3 -m unittest test_generator_snapshot # pins rendered output for one field of each kind ``` `test_field_types.py` and `test_generator_snapshot.py` load the **committed** schema and exercise `process_schema()` / template rendering, so they catch regressions in the derivation logic. The whole-tree guarantee — that `./generate` produces no diff — is enforced by CI, not these unit tests. ## Adding a new database class — checklist 1. Create `schema//dbFoo.json` with the class `name`, its `fields`, and any `structs`/`enums`/includes. 2. If the object is owned by another object, add a `relation` in `schema.json` (parent → `dbFoo`). Add `create`/`destroy` if the trivial factories suffice. 3. If clients iterate it, add an `iterator` entry in `schema.json`. 4. Run `./generate`. 5. Fill in the `User Code` blocks (e.g. iterator `begin`/`next`, custom `create`/`destroy`, any methods declared in the `…PublicMethods` block). 6. Re-run `./generate`, build, and run the tests. Commit the regenerated C++ together with the schema change so CI stays green. # README.html.md # Clock gating This module provides automatic insertion of clock gates for reducing power usage. It uses ABC for proving correctness of gating conditions. The process is roughly: 1. For each register: a. Gather nets connected to the register via BFS (limited to 100 nets for performance, user configurable). If it encounters a register, it doesn’t go through it; it stops there and goes in different directions. b. Check if a previously accepted gating condition can be reused; if so, add this register to that condition’s list of registers. c. Export the network gathered in (a) to ABC. d. Check if all the nets in the exported network can form a correct gating condition using ABC. - First, simulation with random stimuli quickly looks for counterexamples. - Then, if no counterexample was found, a SAT solver is employed to prove that the gating condition is correct. A clock enable condition is checked by ORing the nets, and a clock disable condition by ANDing them. e. If the set of all nets doesn’t form a correct gating condition, move on to the next register. Otherwise: - Check if after removing half of the nets the gating condition still works. - If so, drop the other half of the nets. Otherwise, recurse into the other half of the nets to minimize that subset. - Then, recurse into the first half of the nets to minimize that part. This produces a minimal set of nets that form a gating condition (not necessarily optimal). f. Add the minimal set of nets with the corresponding gated register to a list of accepted gating conditions. First check if it doesn’t contain it already; if it does, add the gated register to the pre-existing condition’s list of registers. 2. For each accepted gating condition with at least 10 corresponding registers (user-configurable), insert a new clock gate that gates the corresponding registers under this condition. Usage: ```tcl read_liberty path/to/pdk/cell/library.lib read_db path/to/your/design.odb read_sdc path/to/your/constraints.sdc clock_gating ``` ## Commands #### NOTE All parameters for clock gating are optional, as indicated by square brackets: `[-param param]`. ### Clock gating ```tcl clock_gating [-min_instances min_instances] [-max_cover max_cover] [-dump_dir dump_dir] ``` #### Options | Switch Name | Description | |------------------|--------------------------------------------------------------------------| | `-min_instances` | Minimum number of instances that should be gated by a single clock gate. | | `-max_cover` | Maximum number of initial gate condition candidate nets per instance. | | `-dump_dir` | Directory for debug dumps. | ## Example scripts Example script on running `cgt` for a sample design of `aes` can be found here: ```default ./test/aes_nangate45.tcl ``` ## Regression tests There are a set of regression tests in `./test`. For more information, refer to this [section](../../README.md#regression-tests). Simply run the following script: ```shell ./test/regression ``` ## Limitations Clock gating is currently not available for designs that contain HA and FA cells which are not supported by ABC. ## FAQs Check out [GitHub discussion](https://github.com/The-OpenROAD-Project/OpenROAD/discussions/categories/q-a?discussions_q=category%3AQ%26A+clock-gating) about this tool. ## References 1. Aaron P. Hurst. 2008. Automatic synthesis of clock gating logic with controlled netlist perturbation. In Proceedings of the 45th annual Design Automation Conference (DAC ‘08). Association for Computing Machinery, New York, NY, USA, 654–657. https://doi.org/10.1145/1391469.1391637 # README.html.md # IR Drop Analysis The IR Drop Analysis module in OpenROAD (`psm`) is based on PDNSim, an open-source static IR analyzer. Features: - Report worst IR drop. - Report worst current density over all nodes and wire segments in the power distribution network, given a placed and PDN-synthesized design. - Check for floating PDN stripes on the power and ground nets. - Spice netlist writer for power distribution network wire segments. ![picorv32](main/src/psm/doc/picorv32.png) ## Commands #### NOTE - Parameters in square brackets `[-param param]` are optional. - Parameters without square brackets `-param2 param2` are required. ### Analyze Power Grid This command analyzes power grid. ```tcl analyze_power_grid -net net_name [-corner corner] [-error_file error_file] [-voltage_file voltage_file] [-enable_em] [-em_outfile em_file] [-vsrc voltage_source_file] [-source_type FULL|BUMPS|STRAPS] [-allow_reuse] ``` #### Options | Switch Name | Description | |-----------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-net` | Name of the net to analyze, power or ground net name. | | `-corner` | Corner to use for analysis. | | `-error_file` | File to write power grid error to. | | `-vsrc` | File to set the location of the power C4 bumps/IO pins. [Vsrc_aes.loc file](test/Vsrc_aes_vdd.loc) for an example with a description specified [here](doc/Vsrc_description.md). | | `-enable_em` | Report current per power grid segment. | | `-em_outfile` | Write the per-segment current values into a file. This option is only available if used in combination with `-enable_em`. | | `-voltage_file` | Write per-instance voltage into the file. | | `-source_type` | Indicate the type of voltage source grid to [model](). FULL uses all the nodes on the top layer as voltage sources, BUMPS will model a bump grid array, and STRAPS will model power straps on the layer above the top layer. | | `-allow_reuse` | Allow the analysis to reuse a previous solution, if one exists. | ### Check Power Grid This command checks power grid. ```tcl check_power_grid -net net_name [-floorplanning] [-error_file error_file] [-dont_require_terminals] ``` #### Options | Switch Name | Description | |---------------------------|---------------------------------------------------------------------------------------------------------------------------------------| | `-net` | Name of the net to analyze. Must be a power or ground net name. | | `-floorplanning` | Ignore non-fixed instances in the power grid, this is useful during floorplanning analysis when instances may not be properly placed. | | `-error_file` | File to write power grid errors to. | | `-dont_require_terminals` | If specified, this will skip checking if there are terminals on the net. | ### Write Spice Power Grid This command writes the `spice` file for power grid. ```tcl write_pg_spice -net net_name [-vsrc vsrc_file] [-corner corner] [-source_type FULL|BUMPS|STRAPS] spice_file ``` #### Options | Switch Name | Description | |----------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-net` | Name of the net to analyze. Must be a power or ground net name. | | `-vsrc` | File to set the location of the power C4 bumps/IO pins. See [Vsrc_aes.loc file](test/Vsrc_aes_vdd.loc) for an example and its [description](doc/Vsrc_description.md). | | `-corner` | Corner to use for analysis. | | `-source_type` | Indicate the type of voltage source grid to [model](). FULL uses all the nodes on the top layer as voltage sources, BUMPS will model a bump grid array, and STRAPS will model power straps on the layer above the top layer. | | `spice_file` | File to write spice netlist to. | ### Set PDNSim Net voltage This command sets PDNSim net voltage. ```tcl set_pdnsim_net_voltage -net net_name -voltage volt [-corner corner] ``` #### Options | Switch Name | Description | |---------------|------------------------------------------------------------------------------------------------------------------------------------------| | `-net` | Name of the net to analyze. It must be a power or ground net name. | | `-voltage` | Sets the voltage on a specific net. If this option is not given, the Liberty file’s voltage value is obtained from operating conditions. | | `-corner` | Corner to use this voltage. If not specified, this voltage applies to all corners. | ### Set PDNSim Instance power This command sets PDNSim instance power. This should only be used when needing to override the computed power. ```tcl set_pdnsim_inst_power -inst inst_name -power power [-corner corner] ``` #### Options | Switch Name | Description | |---------------|--------------------------------------------------------------------------------| | `-inst` | Name of the instance to set the power dor. | | `-power` | Sets the power on a specific instance. | | `-corner` | Corner to use this power. If not specified, this power applies to all corners. | ### Set PDNSim Power Source Settings Set PDNSim power source setting. ```tcl set_pdnsim_source_settings [-bump_dx pitch] [-bump_dy pitch] [-bump_size size] [-bump_interval interval] [-strap_track_pitch pitch] [-external_resistance resistance] ``` #### Options | Switch Name | Description | |------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------| | `-bump_dx`,`-bump_dy` | Set the bump pitch to decide the voltage source location. The default bump pitch is 140um. | | `-bump_size` | Set the bump size. The default bump size is 70um. | | `-bump_interval` | Set the bump population interval, this is used to depopulate the bump grid to emulate signals and other power connections. The default bump pitch is 3. | | `-strap_track_pitch` | Sets the track pitch to use for modeling voltage sources as straps. The default is 10x. | | `-external_resistance` | Set to model the resistance of the package or power network outside the chip/block. The default value is 0.0. | ### Insert Decap Cells The `insert_decap` command inserts decap cells in the areas with the highest IR Drop. The number of decap cells inserted will be limited to the target capacitance defined in the `-target_cap` option. `list_of_decap_with_cap` is a list of even size of decap master cells and their capacitances, e.g., ` ...`. To insert decap cells in the IR Drop of a specific net (power or ground) use `-net `, if not defined the default power net will be used. To use this command, you must first execute the `analyze_power_grid` command with the net to have the IR Drop information. ```tcl insert_decap -target_cap target_cap [-net net_name] -cells list_of_decap_with_cap ``` #### Options | Switch Name | Description | |---------------|------------------------------------------------------------------------------------------| | `-target_cap` | Target capacitance to insert os decap cells. | | `-net` | Power or ground net name. The decap cells will be inserted near the IR Drops of the net. | | `-cells` | List of even size of decap master cells and their capacitances. | ## Source grid options The source grid models how power is going be delivered to the power grid. The image below illustrate how they can be modeled, the red elements are the source models, the black horizontal boxes represent the top metal layer of the power grid, and the gray boxes indicate these are not used in the modeling. | Bumps with 2x interval | Bumps with 3x interval | Straps | Full | |----------------------------------------------------|----------------------------------------------------|--------------------------------------------------|------------------------------------------------| | ![Image 1](main/src/psm/doc/top_grid_bumps_2x.png) | ![Image 2](main/src/psm/doc/top_grid_bumps_3x.png) | ![Image 1](main/src/psm/doc/top_grid_straps.png) | ![Image 2](main/src/psm/doc/top_grid_full.png) | ### Selectively disconnecting sources If you need to be able to disconnect some of the terminals in the design, such as in the case of “what-if” analysis or different chip packaging options. This can be done by assigning `PSM_DISCONNECT` to a terminal or shape in a terminal will cause PDNSim to leave that object disconnected from the analysis. ```tcl # Assumes bpin is the block pin to be disconnected odb::dbBoolProperty_create $bpin PSM_DISCONNECT 1 # Assumes box the box shape in the bpin to be disconnected odb::dbBoolProperty_create $box PSM_DISCONNECT 1 ``` ## Useful Developer Commands If you are a developer, you might find these useful. More details can be found in the [source file](./src/pdnsim.cpp) or the [swig file](./src/pdnsim.i). | Command Name | Description | |----------------|------------------------------| | `find_net` | Get a reference to net name. | ## Example scripts Example scripts demonstrating how to run PDNSim on a sample design on `aes` as follows: ```default ./test/aes_test_vdd.tcl ./test/aes_test_vss.tcl ``` ## Regression tests There are a set of regression tests in `./test`. For more information, refer to this [section](../../README.md#regression-tests). Simply run the following script: ```shell ./test/regression ``` ## Limitations ## FAQs Check out [GitHub discussion](https://github.com/The-OpenROAD-Project/OpenROAD/discussions/categories/q-a?discussions_q=category%3AQ%26A+psm+in%3Atitle) about this tool. ## References 1. PDNSIM [documentation](doc/PDNSim-documentation.pdf) 2. Chhabria, V.A. and Sapatnekar, S.S. (no date) The-openroad-project/pdnsim: Power Grid Analysis, GitHub. Available at: https://github.com/The-OpenROAD-Project/PDNSim (Accessed: 24 July 2023). [(link)](https://github.com/The-OpenROAD-Project/PDNSim) ## License BSD 3-Clause License. See [LICENSE](../../LICENSE) file. # README.html.md # Metal fill This module inserts floating metal fill shapes to meet metal density design rules while obeying DRC constraints. It is driven by a `json` configuration file. ## Commands #### NOTE - Parameters in square brackets `[-param param]` are optional. - Parameters without square brackets `-param2 param2` are required. ### Density Fill This command performs density fill to meet metal density DRC rules. ```tcl density_fill [-rules rules_file] [-area {lx ly ux uy}] ``` #### Options | Switch Name | Description | |---------------|---------------------------------------------------------| | `-rules` | Specify `json` rule file. | | `-area` | Optional. If not specified, the core area will be used. | ## Example scripts The rules `json` file controls fill and you can see an example [here](https://github.com/The-OpenROAD-Project/OpenROAD-flow-scripts/blob/master/flow/platforms/sky130hd/fill.json). The schema for the `json` is: ```json { "layers": { "": { "layers": "", "names": "", "opc": { "datatype": "", "width": "", "height": "", "space_to_fill": "", "space_to_non_fill": "", "space_line_end": "" }, "non-opc": { "datatype": "", "width": "", "height": "", "space_to_fill": "", "space_to_non_fill": "" } }, ... } } ``` The `opc` section is optional depending on your process. The width/height lists are effectively parallel arrays of shapes to try in left to right order (generally larger to smaller). The layer grouping is for convenience. For example in some technologies many layers have similar rules so it is convenient to have a `Mx`, `Cx` group. This all started out in `klayout` so there are some obsolete fields that the parser accepts but ignores (e.g., `space_to_outline`). ## Regression tests There are a set of regression tests in `./test`. For more information, refer to this [section](../../README.md#regression-tests). Simply run the following script: ```shell ./test/regression ``` ## Limitations ## FAQs Check out [GitHub discussion](https://github.com/The-OpenROAD-Project/OpenROAD/discussions/categories/q-a?discussions_q=category%3AQ%26A+metal%20fill+in%3Atitle) about this tool. ## License BSD 3-Clause License. See [LICENSE](../../LICENSE) file. # README.html.md # Chip-level Connections The chip-level connections module in OpenROAD (`pad`) is based on the open-source tool ICeWall. In this utility, either place an IO ring around the boundary of the chip and connect with either wirebond pads or a bump array. ## Commands #### NOTE - Parameters in square brackets `[-param param]` are optional. - Parameters without square brackets `-param2 param2` are required. ### Place IO Terminals In the case where the bond pads are integrated into the padcell, the IO terminals need to be placed. This command place terminals on the padring. Example usage: ```default place_io_terminals u_*/PAD place_io_terminals u_*/VDD ``` ```tcl place_io_terminals -allow_non_top_layer inst_pins ``` #### Options | Switch Name | Description | |------------------------|------------------------------------------------------| | `-allow_non_top_layer` | Allow the terminal to be placed below the top layer. | | `inst_pins` | Instance pins to place the terminals on. | ### Defining a Bump Array This command defines a bump array. Example usage: ```default make_io_bump_array -bump BUMP -origin "200 200" -rows 14 -columns 14 -pitch "200 200" ``` ```tcl make_io_bump_array -bump master -origin {x y} -rows rows -columns columns -pitch {x y} [-prefix prefix] ``` #### Options | Switch Name | Description | |---------------|---------------------------------------------------------------| | `-bump` | Name of the bump master. | | `-origin` | Origin of the array. | | `-rows` | Number of rows to create. | | `-columns` | Number of columns to create. | | `-pitch` | Pitch of the array. | | `-prefix` | Name prefix for the bump array. The default value is `BUMP_`. | ### Remove Entire Bump Array This command removes the entire bump array. Example usage: ```default remove_io_bump_array -bump BUMP ``` ```tcl remove_io_bump_array -bump master ``` #### Options | Switch Name | Description | |---------------|--------------------------| | `-bump` | Name of the bump master. | ### Remove a single Bump Instance This command removes a single bump instance. ```tcl remove_io_bump instance_name ``` #### Options | Switch Name | Description | |-----------------|-------------------| | `instance_name` | Name of the bump. | ### Assign a net to IO Bump This command assigns a net to a bump instance. Example usage: ```default assign_io_bump -net p_ddr_addr_9_o BUMP_6_0 assign_io_bump -net p_ddr_addr_8_o BUMP_6_2 assign_io_bump -net DVSS BUMP_6_4 assign_io_bump -net DVDD BUMP_7_3 assign_io_bump -net DVDD -terminal u_dvdd/DVDD BUMP_8_3 assign_io_bump -net p_ddr_addr_7_o BUMP_7_1 assign_io_bump -net p_ddr_addr_6_o BUMP_7_0 ``` ```tcl assign_io_bump -net net [-terminal iterm] [-dont_route] instance ``` #### Options | Switch Name | Description | |---------------|--------------------------------------------------------------------------------| | `-net` | Net to connect to. | | `-terminal` | Instance terminal to route to. | | `-dont_route` | Flag to indicate that this bump should not be routed, only perform assignment. | | `instance` | Name of the bump. | ### Make IO Sites This command defines an IO site for the pads to be placed into. Example usage: ```default make_io_sites -horizontal_site IOSITE_H -vertical_site IOSITE_V -corner_site IOSITE_C -offset 35 make_io_sites -horizontal_site IOSITE_H -vertical_site IOSITE_V -corner_site IOSITE_C -offset 35 -rotation_horizontal R180 ``` ```tcl make_io_sites -horizontal_site site -vertical_site site -corner_site site -offset offset [-rotation_horizontal rotation] [-rotation_vertical rotation] [-rotation_corner rotation] [-ring_index index] ``` #### Options | Switch Name | Description | |------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-horizontal_site` | Name of the site for the horizontal pads (east and west). | | `-vertical_site` | Name of the site for the vertical pads (north and south). | | `-corner_site` | Name of the site for the corner cells. | | `-offset` | Offset from the die edge to place the rows. | | `-rotation_horizontal` | Rotation to apply to the horizontal sites to ensure pads are placed correctly. The default value is `R0` for the western (left) row when different sites are specified for horizontal and vertical rows; the default value is `MXR90` when the same site is specified. | | `-rotation_vertical` | Rotation to apply to the vertical sites to ensure pads are placed correctly. The default value is `R0` for the southern (bottom) row. | | `-rotation_corner` | Rotation to apply to the corner sites to ensure pads are placed correctly. The default value is `R0` for the south west (lower left) corner. | | `-ring_index` | Used to specify the index of the ring in case of multiple rings. | ### Remove IO Rows When the padring is complete, the following command can remove the IO rows to avoid causing confusion with the other tools. ```tcl remove_io_rows ``` ### Placing Corner Cells This command places the corner cells. ```tcl place_corners master [-ring_index index] ``` #### Options | Switch Name | Description | |---------------|------------------------------------------------------------------| | `master` | Name of the master for the corners. | | `-ring_index` | Used to specify the index of the ring in case of multiple rings. | Example usage: ```default place_corners sky130_fd_io__corner_bus_overlay ``` ### Placing Pads Automatically To place a set of pads into an IO row in the order specified. If bumps have been placed and ports placed, the placer will attempt to align the pads with the bumps (excluding rhe supply nets), while still preserving the order of the pads. Otherwise, the default behavior is to place the pads uniformly. Example usage: ```default place_pads -row IO_SOUTH u_reset.u_in u_reset.u_out ``` ```tcl place_pads -row row_name [-mode mode] pads ``` #### Options | Switch Name | Description | |---------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-row` | Name of the row to place the pad into, examples include: `IO_NORTH`, `IO_SOUTH`, `IO_WEST`, `IO_EAST`, `IO_NORTH_0`, `IO_NORTH_1`. | | `-mode` | Select the mode to use during pad placement, choices are `bump_aligned`, `linear`, `placer`, and `uniform`. Default will select `bump_aligned` if possible, otherwise fallback to `uniform`. | | `pads` | Name of the instances in the order they should be placed (left to right for `IO_SOUTH` and `IO_NORTH` and bottom to top for `IO_WEST` and `IO_EAST`). | #### Modes In `uniform` mode, the pads will be evenly spread out across the row they are assigned to, as shown in the figure below. ![image](main/src/pad/doc/image/mode_uniform.png) In `bump_aligned` mode, the pads will be clustered near their assigned bumps to minimize RDL routing distances, as shown below. ![image](main/src/pad/doc/image/mode_bump_aligned.png) In `linear` mode, the pads will be place starting from the bottom or left of the row next to eachother. ![image](main/src/pad/doc/image/mode_linear.png) In `placer` mode, the pads will be placed according to the following algorithm: 1. Find the ideal position of each pad to minimize RDL routing. 2. Find the best anchor point for each pad taking into account the ordering of the pads and the ideal positions. 3. Perform iterative pad spreading to push pads apart and avoid any obstuctions that may exist. 4. Fix the placement of the pads. ![image](main/src/pad/doc/image/mode_placer.png) ### Placing Pads Manually To place a pad into the pad ring. Example usage: ```default place_pad -row IO_SOUTH -location 280.0 {u_clk.u_in} place_pad -row IO_SOUTH -location 360.0 -mirror {u_reset.u_in} place_pad -master sky130_fd_io__top_ground_hvc_wpad -row IO_SOUTH -location 439.5 {u_vzz_0} place_pad -master sky130_fd_io__top_power_hvc_wpad -row IO_SOUTH -location 517.5 {u_v18_0} ``` ```tcl place_pad -row row_name -location offset -mirror [-master master] name ``` #### Options | Switch Name | Description | |---------------|------------------------------------------------------------------------------------------------------------------------------------| | `-row` | Name of the row to place the pad into, examples include: `IO_NORTH`, `IO_SOUTH`, `IO_WEST`, `IO_EAST`, `IO_NORTH_0`, `IO_NORTH_1`. | | `-location` | Offset from the bottom left chip edge to place the pad at. | | `-mirror` | Specifies if the pad should be mirrored. | | `-master` | Name of the instance master if the instance needs to be created. | | `name` | Name of the instance. | ### Placing IO Filler Cells To place the IO filler cells. Example usage: ```default place_io_fill -row IO_NORTH s8iom0s8_com_bus_slice_10um s8iom0s8_com_bus_slice_5um s8iom0s8_com_bus_slice_1um place_io_fill -row IO_SOUTH s8iom0s8_com_bus_slice_10um s8iom0s8_com_bus_slice_5um s8iom0s8_com_bus_slice_1um place_io_fill -row IO_WEST s8iom0s8_com_bus_slice_10um s8iom0s8_com_bus_slice_5um s8iom0s8_com_bus_slice_1um place_io_fill -row IO_EAST s8iom0s8_com_bus_slice_10um s8iom0s8_com_bus_slice_5um s8iom0s8_com_bus_slice_1um ``` ```tcl place_io_fill -row row_name [-permit_overlaps masters] masters ``` #### Options | Switch Name | Description | |--------------------|------------------------------------------------------------------------------------------------------------------------------------| | `-row` | Name of the row to place the pad into, examples include: `IO_NORTH`, `IO_SOUTH`, `IO_WEST`, `IO_EAST`, `IO_NORTH_0`, `IO_NORTH_1`. | | `-permit_overlaps` | Names of the masters for the IO filler cells that allow for overlapping. | | `masters` | Names of the masters for the IO filler cells. | ### Connecting Ring Signals Once the ring is complete, use the following command to connect the ring signals. ```tcl connect_by_abutment ``` ### Place Wirebond Pads To place the wirebond pads over the IO cells. Example usage: ```default place_bondpad -bond PAD IO_* ``` ```tcl place_bondpad -bond master [-offset {x y}] [-rotation rotation] io_instances ``` #### Options | Switch Name | Description | |----------------|-----------------------------------------------------------------| | `-bond` | Name of the bondpad master. | | `-offset` | Offset to place the bondpad at with respect to the io instance. | | `-rotation` | Rotation of the bondpad. | | `io_instances` | Names of the instances to add bond pads to. | ### Make False IO Site If the library does not contain sites for the IO cells, the following command can be used to add them. This should not be used unless the sites are not in the library. Example usage: ```default make_fake_io_site -name IO_HSITE -width 1 -height 204 make_fake_io_site -name IO_VSITE -width 1 -height 200 make_fake_io_site -name IO_CSITE -width 200 -height 204 ``` ```tcl make_fake_io_site -name name -width width -height height ``` #### Options | Switch Name | Description | |---------------|----------------------------------| | `-name` | Name of the site. | | `-width` | Width of the site (in microns). | | `-height` | Height of the site (in microns). | ### Redistribution Layer Routing To route the Redistribution Layer (RDL) for the bump arrays. ```tcl rdl_route -layer layer [-bump_via access_via] [-pad_via access_via] [-width width] [-spacing spacing] [-turn_penalty penalty] [-allow45] [-max_iterations max_iterations] nets ``` #### Options | Switch Name | Description | |-------------------|---------------------------------------------------------------------------------------------------------------------------------------------| | `-layer` | Layer to route on. | | `-bump_via` | Via to use to to connect the bump to the routing layer. | | `-pad_via` | Via to use to to connect the pad cell to the routing layer. | | `-width` | Width of the routing. Defaults to minimum width for each respective layer. | | `-spacing` | Spacing of the routing. Defaults to minimum spacing for each respective layer. | | `-turn_penalty` | Scaling factor to apply to discurage turning to allow for straighter routes. The default value is `2.0`, and the allowed values are floats. | | `-max_iterations` | Maximum number of router iterations. The default value is `10`. | | `-allow45` | Specifies that 45 degree routing is permitted. | | `nets` | Nets to route. | ### Selectively routing terminals If some of of the terminals in the design do not need to be RDL routed, this can be done by assigning `RDL_ROUTE 0` to a terminal. ```tcl # Assumes iterm is the pin to be not be routed set prop [odb::dbBoolProperty_create $iterm RDL_ROUTE 0] # Change to route iterm $prop setValue 1 ``` ## Useful Developer Commands If you are a developer, you might find these useful. More details can be found in the [source file](./src/ICeWall.cpp) or the [swig file](./src/pad.i). | Command Name | Description | |-------------------|---------------------------------------------------------------------------------------------| | `find_site` | Find site given site name. | | `find_master` | Find master given master name. | | `find_instance` | Find instance given instance name. | | `find_net` | Find net given net name. | | `assert_required` | Assert argument that is required for `cmd` | | `connect_iterm` | Connect instance terminals. Required inputs are: `inst_name`, `iterm_name`, `net_name`. | | `convert_tcl` | These functions read from $ICeWall::library parameters to generate a standalone Tcl script. | ## Example Scripts Example scripts for running ICeWall functions can be found in `./test`. ```default ./test/assign_bumps.tcl ./test/bump_array_make.tcl ./test/bump_array_remove.tcl ./test/bump_array_remove_single.tcl ./test/connect_by_abutment.tcl ./test/make_io_sites.tcl ./test/place_bondpad.tcl ./test/place_bondpad_stagger.tcl ./test/place_pad.tcl ./test/rdl_route.tcl ./test/rdl_route_45.tcl ./test/rdl_route_assignments.tcl ``` ## Regression Tests There are a set of regression tests in `./test`. For more information, refer to this [section](../../README.md#regression-tests). Simply run the following script: ```shell ./test/regression ``` ## Limitations ## FAQs Check out [GitHub discussion](https://github.com/The-OpenROAD-Project/OpenROAD/discussions/categories/q-a?discussions_q=category%3AQ%26A+pad) about this tool. ## License BSD 3-Clause License. See [LICENSE](../../LICENSE) file. # README.html.md # Logic cut This package extracts a cloud of logic using the OpenSTA timing engine, and passes it to ABC either through `blif` interface, or by directly constructing a network. The ABC output is read back by a `blif` reader which is integrated to OpenDB. `blif` writer and reader also support constants from and to OpenDB. Alternatively, the logic can be reconstructed in OpenDB directly from ABC structures. ## Commands This module is not meant to be used directly by users, and as such does not provide any commands. ## Regression tests There are a set of regression tests in `./test`. For more information, refer to this [section](../../README.md#regression-tests). Simply run the following script: ```shell ./test/regression ``` ## Limitations ## FAQs ## Authors ## License BSD 3-Clause License. See [LICENSE](../../LICENSE) file. # README.html.md # Parasitics Extraction The parasitics extraction module in OpenROAD (`rcx`) is based on the open-source OpenRCX, a Parasitic Extraction (PEX, or RCX) tool that works on OpenDB design APIs. It extracts routed designs based on the LEF/DEF layout model. OpenRCX extracts both Resistance and Capacitance for wires, based on coupling distance to the nearest wire and the track density context over and/or under the wire of interest, as well as cell abstracts. The capacitance and resistance measurements are based on equations of coupling distance interpolated on exact measurements from a calibration file, called the Extraction Rules file. The Extraction Rules file (RC technology file) is generated once for every process node and corner, using a provided utility for DEF wire pattern generation and regression modeling. OpenRCX stores resistance, coupling capacitance and ground (i.e., grounded) capacitance on OpenDB objects with direct pointers to the associated wire and via db objects. Optionally, OpenRCX can generate a `.spef` file. ## Commands #### NOTE - Parameters in square brackets `[-param param]` are optional. - Parameters without square brackets `-param2 param2` are required. ### Define Process Corner This command defines proccess corner. ```tcl define_process_corner [-ext_model_index index] filename ``` #### Options | Switch Name | Description | |--------------------|-----------------------------------------------------------------------| | `-ext_model_index` | Extraction model index. Expects 2 inputs (an index, and corner name). | | `filename` | Path to process corner file `rcx_patterns.rules`. | ### Extract Parasitics The `extract_parasitics` command performs parasitic extraction based on the routed design. If there are no information on routed design, no parasitics are returned. ```tcl extract_parasitics [-ext_model_file filename] [-corner cornerIndex] [-corner_cnt count] [-max_res ohms] [-coupling_threshold fF] [-debug_net_id id] [-dbg dbg_num ] [-lef_res] [-lef_rc] [-cc_model track] [-context_depth depth] [-no_merge_via_res] [-skip_over_cell ] [-version] ``` #### Options | Switch Name | Description | |-----------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-ext_model_file` | Specify the Extraction Rules file used for the extraction. | | `-corner cornerIndex` | Corner to extract. Default -1. | | `-corner_cnt` | Defines the number of corners used during the parasitic extraction. | | `-max_res` | Combines resistors in series up to the threshold value. | | `-coupling_threshold` | Coupling below this threshold is grounded. The default value is `0.1`, units are in `fF`, accepted values are floats. | | `-debug_net_id` | *Developer Option*: Net ID to evaluate. | | `-dbg dbg_num` | Debug messaging level. Default 0. | | `-lef_res` | Override LEF resistance per unit. | | `-lef_rc` | Use LEF RC values. Default false. | | `-cc_model` | Specify the maximum number of tracks of lateral context that the tool considers on the same routing level. The default value is `10`, and the allowed values are integers `[0, MAX_INT]`. | | `-context_depth` | Specify the number of levels of vertical context that OpenRCX needs to consider for the over/under context overlap for capacitance calculation. The default value is `5`, and the allowed values are integers `[0, MAX_INT]`. | | `-no_merge_via_res` | Separates the via resistance from the wire resistance. | | `-skip_over_cell` | Ignore shapes in cells. .Default false. | | `-version` | select between v1 and v2 modeling. Defaults to 1.0. | ### Write SPEF The `write_spef` command writes the `.spef` output of the parasitics stored in the database. ```tcl write_spef [-net_id net_id] [-nets nets] [-coordinates] filename ``` #### Options | Switch Name | Description | |---------------|--------------------------------------------------| | `-net_id` | Output the parasitics info for specific net IDs. | | `-nets` | Net name. | | `coordinates` | Coordinates TBC. | | `filename` | Output filename. | ### Scale RC Use the `adjust_rc` command to scale the resistance, ground, and coupling capacitance. ```tcl adjust_rc [-res_factor res] [-cc_factor cc] [-gndc_factor gndc] ``` #### Options | Switch Name | Description | |----------------|----------------------------------------| | `-res_factor` | Scale factor for resistance. | | `-cc_factor` | Scale factor for coupling capacitance. | | `-gndc_factor` | Scale factor for ground capacitance. | ### Comparing different SPEF files The `diff_spef` command compares the parasitics in the reference database `.spef`. The output of this command is `diff_spef.out` and contains the RC numbers from the parasitics in the database and the `.spef`, and the percentage RC difference of the two data. ```tcl diff_spef [-file filename] [-spef_corner spef_num] [-ext_corner ext_num] [-r_res] [-r_cap] [-r_cc_cap] [-r_conn] ``` #### Options | Switch Name | Description | |-------------------------|-------------------------------------| | `-file` | Path to the input `.spef` filename. | | `-spef_corner spef_num` | The spef corner to diff. | | `-ext_corner ext_num` | The extraction corner to diff. | | `-r_res` | Read resistance. | | `-r_cap` | Read capacitance. | | `-r_cc_cap` | Read coupled capacitance. | | `r_conn` | Read connections. | ### Extraction Rules File Generation The `bench_wires` command produces a layout which contains various patterns that are used to characterize per-unit length R and C values. The generated patterns model the lateral, vertical, and diagonal coupling capacitances, as well as ground capacitance effects. This command generates a .def file that contains a number of wire patterns. This command is specifically intended for the Extraction Rules file generation only. ```tcl bench_wires [-met_cnt mcnt] [-cnt count] [-len wire_len] [-over] [-diag] [-all] [-db_only] [-v1] [-under_met layer] [-w_list width] [-s_list space] [-over_dist dist] [-under_dist dist] ``` #### Options | Switch Name | Description | |-----------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-met_cnt` | Number of layers used in each pattern. The default value is `-1`, meaning it is not set, and the allowed values are integers `[0, MAX_INT]`. | | `-cnt` | Number of wires in each pattern. The default value is `5`, and the default values are integers `[0, MAX_INT]`. | | `-len` | Wirelength in microns in the pattern. The default value is `100`, and the allowed values are integers `[0, MAX_INT]`. | | `-all` | Consider all different pattern geometries (`over`, `under`, `over_under`, and `diagonal`). | | `-db_only` | Run with db values only. All parameters in `bench_wires` are ignored. | | `-v1` | Generation version one patterns. | | `-under_met` | Consider under metal layer. | | `-w_list` | Lists of wire width multipliers from the minimum spacing defined in the LEF. | | `-s_list` | Lists of wire spacing multipliers from the minimum spacing defined in the LEF. The list will be the input index on the OpenRCX RC table (Extraction Rules file). | | `-over_dist`, `-under_dist` | Consider over and under metal distance respectively. | ### Generate verilog netlist `bench_verilog` is used after the `bench_wires` command. This command generates a Verilog netlist of the generated pattern layout by the `bench_wires` command. This command is optional when running the Extraction Rules generation flow. This step is required if the favorite extraction tool (i.e., reference extractor) requires a Verilog netlist to extract parasitics of the pattern layout. ```tcl bench_verilog [filename] ``` #### Options | Switch Name | Description | |---------------|------------------------------------------------------| | `filename` | Name for the Verilog output file (e.g., `output.v`). | ### Read SPEF The `bench_read_spef` command reads a `.spef` file and stores the parasitics into the database. ```tcl bench_read_spef [filename] ``` #### Options | Switch Name | Description | |---------------|---------------------------------| | `filename` | Path to the input `.spef` file. | ### Write Rule File The `write_rules` command writes the Extraction Rules file (RC technology file) for OpenRCX. It processes the parasitics data from the layout patterns that are generated using the `bench_wires` command, and writes the Extraction Rules file with `` as the output file. This command is specifically intended for the purpose of Extraction Rules file generation. ```tcl write_rules [-file filename] [-dir dir] [-name name] [-db] ``` #### Options | Switch Name | Description | |---------------|------------------------| | `-file` | Output file name. | | `-dir` | Output file directory. | | `-name` | Name of rule. | | `-db` | DB tbc. | ### Write RCX Model The `write_rcx_model` command write the model file after reading capacitance/resistance Tables from Field Solver. ```tcl write_rcx_model [-file filename] ``` #### Options | Switch Name | Description | |---------------|-------------------| | `-file` | Output file name. | ### Init RCX Model The `init_rcx_model` command is used for initialization for creating the model file. ```tcl init_rcx_model [-corner_names names] [-met_cnt met_cnt] ``` #### Options | Switch Name | Description | |-----------------|-------------------------| | `-corner_names` | List of corner names. | | `-met_cnt` | Number of metal layers. | ### Read RCX Tables The `read_rcx_tables` command reads the capacitance and resistance tables from Field Solver Output. ```tcl read_rcx_tables [-corner_name corner_name] [-file in_file_name] [-wire_index wire] [-over] [-under] [-over_under] [-diag] ``` #### Options | Switch Name | Description | |----------------|--------------------------------| | `-corner_name` | Corner name. | | `-file` | Input file name. | | `-wire_index` | Target wire index. | | `-over` | Over pattern family only. | | `-under` | Under pattern family only. | | `-over_under` | OverUnder pattern family only. | | `-diag` | Diagonal pattern family only. | ### Generate Solver Patterns The `gen_solver_patterns` command generates 3D wire patterns not targeting any particular Field Solver. ```tcl gen_solver_patterns [-process_file process_file] [-process_name process_name] [-version version] [-wire_cnt wire_count] [-len wire_len] [-w_list widths] [-s_list spacings] [-over_dist dist] [-under_dist dist] ``` #### Options | Switch Name | Description | |-----------------|--------------------------------------------------------------------------------| | `-process_file` | File that contains full process stack with conductor and dielctric dimensions. | | `-process_name` | Name of the process. | | `-version` | 2 if normalized wires, 1 not normalized; deafult is 1. | | `-wire_cnt` | Number of wires. Default is 3. | | `-len` | Wire length in microns. Default is 10. | | `-w_list` | Min layer Width multiplier list. Default is 1. | | `-s_list` | Min layer spacing multiplier list. Default is “1.0 1.5 2.0 3 5”. | | `-over_dist` | Max number of levels for Under patterns. Default is 4. | | `-under_dist` | Max number of levels for Over patterns. Default is 4. | ### Define RCX Corners The `define_rcx_corners` command defines specific corners to extract parasitics. ```tcl define_rcx_corners [-corner_list corner_list] ``` #### Options | Switch Name | Description | |----------------|-----------------------| | `-corner_list` | List of corner names. | ### Get Model Corners The `get_model_corners` command lists all the corner names from a model file. ```tcl get_model_corners [-ext_model_file file_name] ``` #### Options | Switch Name | Description | |-------------------|------------------| | `-ext_model_file` | Input file name. | ### Generate RCX Model The `gen_rcx_model` command ```tcl gen_rcx_model [-spef_file_list spefList] [-corner_list cornerList] [-out_file outfilename] [-comment comment] [-version version] [-pattern pattern] ``` #### Options | Switch Name | Description | |-------------------|-------------------------------------------------------| | `-spef_file_list` | List of spef file names. | | `-corner_list` | List of corners. | | `-out_file` | Output file name. | | `-comment` | Comment on the model file. Default: “RCX Model File”. | | `-version` | Version of the model file. | | `-pattern` | Pattern of the model file. | ### Bench Wires Generation The `bench_wires_gen` command generates comprehensive benchmarking patterns (not for model generation). ```tcl bench_wires_gen [ -len length_in_min_widths ] [ -met metal ] [ -mlist metal_list ] [ -width multiplier_width_list ] [ -spacing multiplier_spacing_list ] [ -couple_width multiplier_coupling_width_list ] [ -couple_spacing multiplier_coupling_spacing_list ] [ -over_width multiplier_over_width_list ] [ -over_spacing multiplier_over_spacing_list ] [ -under_width multiplier_under_width_list ] [ -under_spacing multiplier_under_spacing_list ] [ -over2_width multiplier_over2_width_list ] [ -over2_spacing multiplier_over2_spacing_list ] [ -under2_width multiplier_under2_width_list ] [ -under2_spacing multiplier_under2_spacing_list ] [ -dbg dbg_flag ] [ -wire_cnt wire_count ] [ -offset_over offset_over ] [ -offset_under offset_under ] [ -under_dist max_dist_to_under_met ] [ -over_dist max_dist_to_over_met ] [ -diag ] [ -over ] [ -under ] [ -over_under ] ``` #### Options | Switch Name | Description | |-------------------|-----------------------------------| | `-len` | length_in_min_widths. | | `-met` | target metal. | | `-mlist` | target metal_list. | | `-width` | multiplier_width_list. | | `-spacing` | multiplier_spacing_list. | | `-couple_width` | multiplier_coupling_width_list. | | `-couple_spacing` | multiplier_coupling_spacing_list. | | `-over_width` | multiplier_over_width_list. | | `-over_spacing` | multiplier_over_spacing_list. | | `-under_width` | multiplier_under_width_list. | | `-under_spacing` | multiplier_under_spacing_list. | | `-over2_width` | multiplier_over2_width_list. | | `-over2_spacing` | multiplier_over2_spacing_list. | | `-under2_width` | multiplier_under2_width_list. | | `-under2_spacing` | multiplier_under2_spacing_list. | | `-dbg` | dbg_flag. | | `-wire_cnt` | wire_count. | | `-offset_over` | offset_over. | | `-offset_under` | offset_under. | | `-under_dist` | max_dist_to_under_met. | | `-over_dist` | max_dist_to_over_met. | | `-diag` | Diag pattern family only. | | `-over` | Over pattern family only. | | `-under` | Under pattern family only. | | `-over_under` | OverUnder pattern family only. | ## Example scripts Example scripts demonstrating how to run OpenRCX in the OpenROAD environment on sample designs can be found in /test. An example flow test taking a sample design from synthesizable RTL Verilog to final-routed layout in an open-source SKY130 technology is shown below. ```default ./test/gcd.tcl ``` Example scripts demonstrating how to run the Extraction Rules file generation can be found in this [directory](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/rcx/calibration/script). ```default ./calibration/script/generate_patterns.tcl # generate patterns ./calibration/script/generate_rules.tcl # generate the Extraction Rules file ./calibration/script/ext_patterns.tcl # check the accuracy of OpenRCX ``` ## Regression tests There are a set of regression tests in `/test`. For more information, refer to this [section](../../README.md#regression-tests). Simply run the following script: ```shell ./test/regression ``` ## Extraction Rules File Generation This flow generates an Extraction Rules file (RC tech file, or RC table) for OpenRCX. This file provides resistance and capacitance tables used for RC extraction for a specific process corner. The Extraction Rules file (RC technology file) is generated once for every process node and corner automatically. The detailed documentation can be found [here](doc/calibration.md). ## Limitations ## FAQs Check out [GitHub discussion](https://github.com/The-OpenROAD-Project/OpenROAD/discussions/categories/q-a?discussions_q=category%3AQ%26A+rcx) about this tool. ## License BSD 3-Clause License. See [LICENSE](../../LICENSE) file. # README.html.md # DFT: Design for Testing The Design for Testing module in OpenROAD (`dft`) is an implementation of Design For Testing. New nets and logic are added to allow IC designs to be tested for errors in manufacturing. Physical imperfections can cause hard failures and variability can cause timing errors. A simple DFT insertion consist of the following parts: * A scan_in pin where the test patterns are shifted in. * A scan_out pin where the test patterns are read from. * Scan cells that replace flops with registers that allow for testing. * One or more scan chains (shift registers created from your scan cells). * A scan_enable pin to allow your design to enter and leave the test mode. ## Commands #### NOTE - Parameters in square brackets `[-param param]` are optional. - Parameters without square brackets `-param2 param2` are required. ### Set DFT Config The command `set_dft_config` sets the DFT configuration variables. ```tcl set_dft_config [-max_length ] [-max_chains ] [-clock_mixing ] [-scan_enable_name_pattern ] [-scan_in_name_pattern ] [-scan_out_name_pattern ] ``` #### Options | Switch Name | Description | |-------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-max_length` | The maximum number of bits that can be in each scan chain. | | `-max_chains` | The maximum number of scan chains that will be generated. This takes priority over `max_length`, | | in `no_mix` clock mode it specifies a maximum number of chains per clock-edge pair. | | | `-clock_mixing` | How architect will mix the scan flops based on the clock driver. `no_mix`: Creates scan chains with only one type of clock and edge. This may create unbalanced chains. `clock_mix`: Creates scan chains mixing clocks and edges. Falling edge flops are going to be stitched before rising edge. | | `-scan_enable_name_pattern` | A format pattern with one or less set of braces (`{}`) to use to find or create scan enable drivers during scan chain stitching. The braces, if found, will be set to `0` as DFT architectures typically use a single shift-enable for all scan chains. If an un-escaped forward slash (`/`) is found, instead of searching for and/or creating a top-level port, an instance’s pin will be searched for instead where the part of the string preceding the `/` is interpreted as the instance name and part succeeding it will be interpreted as the pin’s name. | | `-scan_in_name_pattern` | A format pattern with one or less braces (`{}`) to use to find or create scan in drivers during scan chain stitching. The braces will be replaced with the chain’s ordinal number (starting at `0`). If an un-escaped forward slash (`/`) is found, instead of searching for and/or creating a top-level port, an instance’s pin will be searched for instead where the part of the string preceding the `/` is interpreted as the instance name and part succeeding it will be interpreted as the pin’s name. | | `-scan_out_name_pattern` | A format pattern with one or less braces (`{}`) to use to find or create scan in loads during scan chain stitching. The braces will be replaced with the chain’s ordinal number (starting at `0`). If an un-escaped forward slash (`/`) is found, instead of searching for and/or creating a top-level port, an instance’s pin will be searched for instead where the part of the string preceding the `/` is interpreted as the instance name and part succeeding it will be interpreted as the pin’s name. | ### Report DFT Config Prints the current DFT configuration to be used by `report_dft_plan` and `execute_dft_plan`. ```tcl report_dft_config ``` ### Scan replace Replaces flipflops with equivalent scan flipflops. This will generally be called before placement, as it changes the area of cells. ```tcl scan_replace ``` ### Report DFT Plan Prints a preview of the scan chains that will be stitched by `execute_dft_plan`. Use this command to iterate and try different DFT configurations. This command does not perform any modification to the design, and should be run after `scan_replace` and global placement. ```tcl report_dft_plan [-verbose] ``` #### Options | Switch Name | Description | |---------------|--------------------------------------------------------------------------------| | `-verbose` | Shows more information about each one of the scan chains that will be created. | ### Execute DFT Plan Architect scan chains and connect them up in a way that minimises wirelength. As a result, this should be run after placement, and after `scan_replace`. ```tcl execute_dft_plan ``` ### Scan Optimization **Note: This is currently not implemented and this command currently operates as a nop.** Performs scan optimizations on the design reordering the flops of the scan chains using the latest placement information. ```tcl scan_opt ``` ## Example scripts This example will create scan chains with a max length of 10 bits mixing all the scan flops in the scan chains. ```default set_dft_config -max_length 10 -clock_mixing clock_mix report_dft_config scan_replace # Run global placement... report_dft_plan -verbose execute_dft_plan ``` ## Regression tests There are a set of regression tests in `./test`. For more information, refer to this [section](../../README.md#regression-tests). Simply run the following script: ```shell ./test/regression ``` ## Limitations * There are no optimizations for the scan chains. This is a WIP. * There is no way to specify existing scan ports to be used by scan insertion. * There is currently no way to define a user defined scan path. * We can only work with one bit cells. ## License BSD 3-Clause License. See [LICENSE](../../LICENSE) file. # README.html.md # Unit Test Infrastructure This is infrastructure to support C++ unit tests. It is not linked into the OpenROAD application. This provides a basic gtest fixture that has commonly needed infrastructure classes and helper methods to load LEF & Liberty. # README.html.md # Example This is an example tool to demonstrate how to setup a new tool in OpenROAD. ## Commands ### Example Instance This command makes an instance. ```tcl example_instance [-name name] ``` #### Options | Switch Name | Description | |---------------|----------------------------------------------------------| | `[-name]` | The name of the instance to create. Defaults to example. | # README.html.md # Detailed Placement The detailed placement module in OpenROAD (`dpl`) is based on OpenDP, or Open-Source Detailed Placement Engine. Its key features are: - Fence region support - Fragmented row support - Mixed-cell-height (1x–4x) legalization - Two placement engines selectable at runtime ## Placement Engines ### Diamond Search The default engine performs a BFS-style diamond search from each cell’s global placement position, expanding outward in Manhattan order until a legal site is found. ### NegotiationLegalizer An optional two-pass legalizer based on the NBLG paper. Enabled with `-use_negotiation` on the `detailed_placement` command. ```default Global Placement result │ ▼ ┌───────────────────┐ │ Abacus Pass │ Fast DP sweep, row-by-row. │ (Skipped) │ Near-optimal for uncongested cells. │ │ Mixed-cell-height via row assignment. │ Handles: │ Power-rail alignment enforced. │ - 1x/2x/3x/4x │ Fence violations → skipped (→ negotiation). │ - Fence regions │ └────────┬──────────┘ │ illegal cells (overlap / fence violated) ▼ ┌───────────────────┐ │ Negotiation Pass │ Iterative rip-up & replace (from NBLG paper). │ │ Illegal cells + spatial neighbors compete for │ NBLG components: │ grid resources. History cost penalises │ - Adaptive pf │ persistent congestion. Isolation point skips │ - Isolation pt │ already-legal cells in phase 2. │ - History cost │ └────────┬──────────┘ │ ▼ ┌───────────────────┐ │ Post-optimisation │ Greedy displacement improvement (5 passes). │ (Skipped) │ Cell swap via bipartite matching within groups. │ │ └────────┬──────────┘ │ ▼ Legal placement written back to OpenDB ``` # Commands #### NOTE - Parameters in square brackets `[-param param]` are optional. - Parameters without square brackets `-param2 param2` are required. ## Detailed Placement The `detailed_placement` command performs detailed placement of instances to legal locations after global placement. ```tcl detailed_placement [-max_displacement disp|{disp_x disp_y}] [-disallow_one_site_gaps] [-report_file_name filename] [-use_negotiation] [-abacus] ``` ### Options | Switch Name | Description | |---------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-max_displacement` | Max distance that an instance can be moved (in microns) when finding a site where it can be placed. Either set one value for both directions or set `{disp_x disp_y}` for individual directions. The default values are `{0, 0}`, and the allowed values within are integers `[0, MAX_INT]`. | | `-disallow_one_site_gaps` | Option is deprecated. | | `-report_file_name` | File name for saving the report to (e.g. `report.json`.) | | `-incremental` | By default DPL initiates with all instances unplaced. With this flag DPL will check for already legalized instances and set them as placed. | | `-report_file_name` | File name for saving the report to (e.g. `report.json`.) | | `-use_negotiation` | Use the NegotiationLegalizer instead of the default diamond search engine. | | `-abacus` | Enable the Abacus pre-pass within the NegotiationLegalizer. Only effective when `-use_negotiation` is set. | ## Set Placement Padding The `set_placement_padding` command sets left and right padding in multiples of the row site width. Use the `set_placement_padding` command before legalizing placement to leave room for routing. Use the `-global` flag for padding that applies to all instances. Use `-instances` for instance-specific padding. The instances `insts` can be a list of instance names, or an instance object returned by the SDC `get_cells` command. To specify padding for all instances of a common master, use the `-filter` “ref_name == ” option to `get_cells`. ```tcl set_placement_padding -global|-masters masters|-instances insts [-right site_count] [-left site_count] ``` ### Options #### WARNING Either one of these flags must be set: `-global | -masters | -instances`. The order of preference is `global > masters > instances` | Switch Name | Description | |---------------|-------------------------------------------------------------------------------------------------| | `-global` | Set padding globally using `left` and `right` values. | | `-masters` | Set padding only for these masters using `left` and `right` values. | | `-instances` | For `-instances`, you will set padding only for these insts using `left` and `right` values. | | `-left` | Left padding (in site count). | | `-right` | Right padding (in site count). | | `instances` | Set padding for these list of instances. Not to be confused with the `-instances` switch above. | ## Filler Placement The `filler_placement` command fills gaps between detail-placed instances to connect the power and ground rails in the rows. `filler_masters` is a list of master/macro names to use for filling the gaps. Wildcard matching is supported, so `FILL*` will match, e.g., `FILLCELL_X1 FILLCELL_X16 FILLCELL_X2 FILLCELL_X32 FILLCELL_X4 FILLCELL_X8`. To specify a different naming prefix from `FILLER_` use `-prefix `. ```tcl filler_placement [-prefix prefix] [-verbose] filler_masters ``` ### Options | Switch Name | Description | |------------------|------------------------------------------------------------------| | `-prefix` | Prefix to name the filler cells. The default value is `FILLER_`. | | `-verbose` | Print the filler cell usage. | | `filler_masters` | Filler master cells. | ## Remove Fillers This command removes all filler cells. ```tcl remove_fillers ``` ## Check Placement The `check_placement` command checks the placement legality. It returns `0` if the placement is legal. ```tcl check_placement [-verbose] [-disallow_one_site_gaps] [-report_file_name filename] ``` ### Options | Switch Name | Description | |---------------------------|----------------------------------------------------------| | `-verbose` | Enable verbose logging. | | `-disallow_one_site_gaps` | Option is deprecated. | | `-report_file_name` | File name for saving the report to (e.g. `report.json`.) | ## Optimize Mirroring The `optimize_mirroring` command mirrors instances about the Y axis in a weak attempt to reduce the total half-perimeter wirelength (HPWL). ```tcl optimize_mirroring ``` ## Improve Placement The `improve_placement` command optimizes a given placed design. ```tcl improve_placement [-random_seed seed] [-max_displacement disp|{disp_x disp_y}] [-disallow_one_site_gaps] ``` ## Useful Developer Commands If you are a developer, you might find these useful. More details can be found in the [source file](./src/Opendp.cpp) or the [swig file](./src/Opendp.i). | Command Name | Description | |----------------------------|-----------------------------------------------------------------| | `detailed_placement_debug` | Debug detailed placement. | | `get_masters_arg` | Get masters from a design. | | `get_inst_bbox` | Get bounding box of an instance. | | `get_inst_grid_bbox` | Get grid bounding box of an instance. | | `format_grid` | Format grid (takes in length `x` and site width `w` as inputs). | | `get_row_site` | Get row site name. | ## Example scripts Examples scripts demonstrating how to run `dpl` on a sample design of `aes` as follows: ```shell ./test/aes.tcl ``` ## Regression tests There are a set of regression tests in `./test`. Refer to this [section](../../README.md#regression-tests) for more information. Simply run the following script: ```shell ./test/regression ``` ## Limitations The following limitations apply when using the NegotiationLegalizer (`-use_negotiation`): 1. **Abacus cluster chain**: The current Abacus implementation uses a simplified cluster structure. A production version should maintain an explicit doubly-linked list of cells within each cluster, as in the original Spindler et al. paper. 2. **Multithreading**: The negotiation pass is single-threaded. Extend with the inter-region parallelism from NBLG (Algorithm 2, dynamic region adjustment) using OpenMP or std::thread. 3. **Fence region R-tree**: Replace linear scan in `FenceRegion::nearestRect()` with a spatial index (Boost.Geometry rtree or OpenROAD’s existing RTree) for large designs with many fence sub-rectangles. 4. **Row rail inference**: Currently uses row-index parity as a proxy for VDD/VSS. Replace with actual LEF pg_pin parsing once available in the build context. ## FAQs Check out [GitHub discussion](https://github.com/The-OpenROAD-Project/OpenROAD/discussions/categories/q-a?discussions_q=category%3AQ%26A+opendp+in%3Atitle) about this tool. ## Authors - SangGi Do and Mingyu Woo (respective Ph. D. advisors: Seokhyeong Kang, Andrew B. Kahng). - Rewrite and port to OpenDB/OpenROAD by James Cherry, Parallax Software ## References 1. Do, S., Woo, M., & Kang, S. (2019, May). Fence-region-aware mixed-height standard cell legalization. In Proceedings of the 2019 on Great Lakes Symposium on VLSI (pp. 259-262). [(.pdf)](https://dl.acm.org/doi/10.1145/3299874.3318012) 2. P. Spindler et al., “Abacus: Fast legalization of standard cell circuits with minimal movement,” ISPD 2008. 3. J. Chen et al., “NBLG: A Robust Legalizer for Mixed-Cell-Height Modern Design,” IEEE TCAD, vol. 41, no. 11, 2022. 4. L. McMurchie and C. Ebeling, “PathFinder: A negotiation-based performance-driven router for FPGAs,” 1995. ## License BSD 3-Clause License. See [LICENSE](../../LICENSE) file. # README.html.md # Pin Placer Place pins on the boundary of the die on the track grid to minimize net wirelengths. Pin placement also creates a metal shape for each pin using min-area rules. For designs with unplaced cells, the net wirelength is computed considering the center of the die area as the unplaced cells position. ## Commands #### NOTE - Parameters in square brackets `[-param param]` are optional. - Parameters without square brackets `-param2 param2` are required. ### Define Pin Shape Pattern The `define_pin_shape_pattern` command defines a pin placement grid on the specified layer. This grid has positions inside the die area, not only at the edges of the die boundary. ```tcl define_pin_shape_pattern [-layer layer] [-x_step x_step] [-y_step y_step] [-region {llx lly urx ury} | *] [-size {width height}] [-pin_keepout dist] ``` #### Options | Switch Name | Description | |----------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-layer` | The single top-most routing layer of the placement grid. | | `-x_step`, `-y_step` | The distance (in microns) between each valid position on the grid in the x- and y-directions, respectively. | | `-region` | The `{llx, lly, urx, ury}` region of the placement grid (in microns). If the `*` is specified, the region will be the entire die area. | | `-size` | The width and height (in microns) of the pins assigned to this grid. The centers of the pins are placed on the grid positions. Pins may have half of their shapes outside the defined region. | | `-pin_keepout` | The boundary (in microns) around existing routing obstructions that the pins should avoid; this defaults to the `layer` minimum spacing. | #### Face-to-Face direct-bonding IOs The `define_pin_shape_pattern` command can be used to place pins in any metal layer with the minimum allowed spacing to facilitate 3DIC integration of chips using face-to-face packaging technologies. These technologies include [micro bumps](https://semiengineering.com/bumps-vs-hybrid-bonding-for-advanced-packaging/) and [hybrid bonding](https://www.3dincites.com/2018/04/hybrid-bonding-from-concept-to-commercialization/) for high density face-to-face interconnect. ### Set IO Pin Constraints The `set_io_pin_constraint` command sets region constraints for pins according to the pin direction or the pin name. This command can be called multiple times with different constraints. You can use the `set_io_pin_constraint` command to restrict pins to the pin placement grid created with the `define_pin_shape_pattern` command. It is possible to use the `-region`, `-group` and `-order` arguments together per `set_io_pin_constraint` call, but the `-mirrored_pins` argument should be called alone. ```tcl set_io_pin_constraint [-direction direction] [-pin_names names] [-region edge:interval] [-mirrored_pins names] [-group] [-order] ``` #### Options | Switch Name | Description | |------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-direction` | Pin direction (`input`, `output`, `inout`, or `feedthrough`). | | `-pin_names` | List of names. Only one of (`-direction`, `-pin_names`) should be used in a single call for the `set_io_pin_constraint` command. | | `-region` | Syntax is `-region edge:interval`. The `edge` values are (`top|bottom|left|right`). The `interval` can be the whole edge with the wildcard `*` value or a range of values `begin-end` in microns. For example, in `-region right:15-60` the interval is on the right edge from 15 microns to 60 microns. | | `-mirrored_pins` | List of pins that sets pairs of pins that will be symmetrically placed in the vertical or the horizontal edges. The number of pins in this list **must be even**. For example, in `set_io_pin_constraint -mirrored_pins {pin1 pin2 pin3 pin4 pin5 pin6}`, the pins `pin1` and `pin2` will be placed symmetrically to each other. Same for `pin3` and `pin4`, and for `pin5` and `pin6`. | | `-group` | Flag places together on the die boundary the pin list defined in `-pin_names,` similar to the `-group_pins` option on the `place_pins` command. | | `-order` | Flag places the pins ordered in ascending x/y position and must be used only when `-group` is also used. | The `edge` values are (up, top, bottom, left, right), where `up` is the grid created by `define_pin_shape_pattern`. To restrict pins to the pin placement grid defined with `define_pin_shape_pattern` use: - `-region up:{llx lly urx ury}` to restrict the pins into a specific region in the grid. The region is defined in microns. - `-region up:*` to restrict the pins into the entire region of the grid. The `up` option is only available when the pin placement grid is created with the `define_pin_shape_pattern` command. ### Exclude IO Pin Region The `exclude_io_pin_region` command sets regions in the die edges where pins cannot be placed. It is possible to use the `-region` argument multiple times in a single call of `exclude_io_pin_region`. ```tcl exclude_io_pin_region -region edge:interval ``` #### Options | Switch Name | Description | |---------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-region` | Syntax is `-region edge:interval`. The `edge` values are (`top|bottom|left|right`). The `interval` can be the whole edge with the wildcard `*` value or a range of values. | ### Clear IO Pin Constraints The `clear_io_pin_constraints` command clears all the previously-defined constraints and pin shape patterns created with `set_io_pin_constraint` or `define_pin_shape_pattern`. ```tcl clear_io_pin_constraints ``` ### Set Pin Length The `set_pin_length` command defines the length of all vertical and horizontal pins. ```tcl set_pin_length [-hor_length h_length] [-ver_length v_length] ``` #### Options | Switch Name | Description | |---------------|-------------------------------------------------| | `-hor_length` | The length (in microns) of the horizontal pins. | | `-ver_length` | The length (in microns) of the vertical pins. | The default length of the pins is the minimum length necessary to respect the minimum area defined in the routing layer they were placed. The width of the pins is the minimum width defined in the routing layer. ### Set Pin Length Extension The `set_pin_length_extension` command defines the an extension of the length of all vertical and horizontal pins. Note that this command may generate pins partially outside the die area. ```tcl set_pin_length_extension [-hor_extension h_extension] [-ver_extension v_extension] ``` #### Options | Switch Name | Description | |------------------|--------------------------------------------------| | `-hor_extension` | The length (in microns) for the horizontal pins. | | `-ver_extension` | The length (in microns) for the vertical pins. | ### Set Pin Thickness Multiplier The `set_pin_thick_multiplier` command defines a multiplier for the thickness of all vertical and horizontal pins. ```tcl set_pin_thick_multiplier [-hor_multiplier h_mult] [-ver_multiplier v_mult] ``` #### Options | Switch Name | Description | |-------------------|---------------------------------------------------| | `-hor_multiplier` | The thickness multiplier for the horizontal pins. | | `-ver_multiplier` | The thickness multiplier for the vertical pins. | ### Set Simulated Annealing The `set_simulated_annealing` command defines the parameters for simulated annealing pin placement. ```tcl set_simulated_annealing [-temperature temperature] [-max_iterations iter] [-perturb_per_iter perturbs] [-alpha alpha] ``` #### Options | Switch Name | Description | |---------------------|--------------------------------------------------------------------------------------------------------------------------| | `-temperature` | Temperature parameter. The default value is `1.0`, and the allowed values are floats `[0, MAX_FLOAT]`. | | `-max_iterations` | The maximum number of iterations. The default value is `2000`, and the allowed values are integers `[0, MAX_INT]`. | | `-perturb_per_iter` | The number of perturbations per iteration. The default value is `0`, and the allowed values are integers `[0, MAX_INT]`. | | `-alpha` | The temperature decay factor. The default value is `0.985`, and the allowed values are floats `(0, 1]`. | ### Simulated Annealing Debug Mode The `simulated_annealing_debug` command allows you to debug the simulated annealing pin placement with a pause mode. ```tcl simulated_annealing_debug [-iters_between_paintings iters] [-no_pause_mode no_pause_mode] ``` #### Options | Switch Name | Description | |----------------------------|---------------------------------------------------------------------| | `-iters_between_paintings` | Determines the number of iterations between updates. | | `-no_pause_mode` | Print solver state every second based on `iters_between_paintings`. | ### Place specific Pin The `place_pin` command places a specific pin in the specified location with the specified size. It is recommended that individual pins be placed before the `place_pins` command, as the routing tracks occupied by these individual pins will be blocked, preventing overlaps. To place an individual pin: ```tcl place_pin -pin_name pin_name -layer layer -location {x y} [-pin_size {width height}] [-force_to_die_boundary] [-placed_status] ``` #### Options | Switch Name | Description | |--------------------------|------------------------------------------------------------------------------------------------------------| | `-pin_name` | The name of a pin of the design. | | `-layer` | The routing layer where the pin is placed. | | `-location` | The center of the pin (in microns). | | `-pin_size` | The width and height of the pin (in microns). | | `-force_to_die_boundary` | When this flag is enabled, the pin will be snapped to the nearest routing track, next to the die boundary. | | `-placed_status` | When this flag is enabled, the pin will have PLACED as its placement status, instead of the FIXED status. | ### Place all Pins The `place_pins` command places all pins together. Use the following command to perform pin placement: ```tcl place_pins -hor_layers h_layers -ver_layers v_layers [-corner_avoidance length] [-min_distance distance] [-min_distance_in_tracks] [-exclude region] [-group_pins pin_list] [-annealing] [-write_pin_placement file_name] ``` #### Options | Switch Name | Description | |---------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-hor_layers` | The layers to create the metal shapes of pins placed in horizontal tracks. It can be a single layer or a list of layer names. | | `-ver_layers` | The layers to create the metal shapes of pins placed in vertical tracks. It can be a single layer or a list of layer names. | | `-corner_avoidance` | The distance (in microns) from each corner within which pin placement should be avoided. | | `-min_distance` | The minimum distance between pins on the die boundary. This distance can be in microns (default) or in number of tracks between each pin. The default value is the length of two routing tracks between each pin. | | `-min_distance_in_tracks` | Flag that allows setting the min distance in number of tracks instead of microns. | | `-exclude` | A region where pins cannot be placed. Either `top|bottom|left|right:edge_interval`, which is the edge interval from the selected edge; `begin:end` for begin-end of all edges. | | `-group_pins` | A list of pins to be placed together on the die boundary. | | `-annealing` | Flag to enable simulated annealing pin placement. | | `-write_pin_placement` | A file with the pin placement generated in the format of multiple calls for the `place_pin` command. | The `exclude` option syntax is `-exclude edge:interval`. The `edge` values are (top|bottom|left|right). The `interval` can be the whole edge, with the `*` value, or a range of values. For example, in `place_pins -hor_layers metal2 -ver_layers metal3 -exclude top:* -exclude right:15-60.5 -exclude left:*-50` three intervals are excluded: the whole top edge, the right edge from 15 microns to 60.5 microns, and the left edge from its beginning to 50 microns. ### Write Pin Placement The `write_pin_placement` command writes a file with the pin placement in the format of multiple calls for the `place_pin` command: ```tcl write_pin_placement file_name -placed_status ``` #### Options | Switch Name | Description | |------------------|------------------------------------------------------------------------------------------------------------------------| | `file_name` | The name of the file with the pin placement. | | `-placed_status` | When this flag is enabled, the file will be generated´with the `-placed_status` flag in each `place_pin` command call. | ### Rectilinear Floorplans The `place_pins` command supports designs with a rectilinear (non-rectangular) die outline, such as those created by `initialize_floorplan` with a polygonal `-die_area` (see the [`ifp` documentation](../ifp/README.md#rectilinear-floorplans)). Rectilinear mode is detected automatically from the die polygon stored in the database; no extra option is required. Pins are distributed along the edges of the polygonal die boundary. ```tcl place_pins -hor_layers metal3 -ver_layers metal2 ``` ## Useful Developer Commands If you are a developer, you might find these useful. More details can be found in the [source file](./src/IOPlacer.cpp) or the [swig file](./src/IOPlacer.i). | Command Name | Description | |-------------------------|-------------------------------------| | `parse_edge` | Parse edge (top/bottom/left/right). | | `parse_direction` | Parse direction. | | `parse_excludes_arg` | Parse excluded arguments. | | `parse_group_pins_arg` | Parse group pins arguments. | | `parse_layer_name` | Parse layer name. | | `parse_pin_names` | Parse pin names. | | `get_edge_extreme` | Get extremes of edge. | | `exclude_intervals` | Set exclude interval. | | `add_pins_to_top_layer` | Add pins to top layer. | ## Example scripts Example scripts of `ppl` running on a sample design of `gcd` as follows: ```default ./test/gcd.tcl ``` ## Regression tests There are a set of regression tests in `./test`. For more information, refer to this [section](../../README.md#regression-tests). Simply run the following script: ```shell ./test/regression ``` ## Limitations ## References - This code depends on [Munkres](src/munkres/README.txt). ## FAQs Check out [GitHub discussion](https://github.com/The-OpenROAD-Project/OpenROAD/discussions/categories/q-a?discussions_q=category%3AQ%26A+ioplacer+in%3Atitle) about this tool. ## License BSD 3-Clause License. See [LICENSE](../../LICENSE) file. # README.html.md # Manpages Test Framework There are 4 regression tests we conduct for the manpages, namely: - Translator - Count output files - Man functionality check - Man-to-Tcl check There are also 2 CI tests as part of the They can be found in `.github/workflows/github-actions-docs-test.yml` file. ## Regression tests This is divided into static and dynamic regression tests. Static tests are designed to test the script functionality, whereas dynamic tests are designed to test the documentation compatibitity with the script and will be housed in individual module folders. ### Static Test #### Translator The code file can be found [here](translator.py). The objective of this test is to test if the underlying `README.md` file can be converted to roff format via regex extraction. Namely, the script checks for equality in the number of function names, descriptors, synopsis, options and arguments detected per Tcl command. #### Man functionality check The code file can be found [here](man_func.tcl). The objective of this test is to check the functionality of the Tcl `man` command implemented within the OpenROAD binary. Mode 1 is where we run `man -manpath `, and mode 2 is where we do not specify the `-manpath` argument and just run `man `. This check makes sure that the files are compiled in the correct location and viewable by the `man` command. ### Dynamic Test For all the tests below, do make sure to update it locally every time you make a change to the `README.md`, update messages, or make a change to the top-level `Tcl` code. #### README-messages check The name of this test is `{MODULE}_readme_msgs_check.py`. The objective of this test is to check the number of parsed module commands and messages. ### Man-to-Tcl check The name of this test is `{MODULE}_man_tcl_check.py` The objective of this test is to ensure that there are similar counts of command in the following: `proc`, `help`, `man`. `proc` and `help` commands are parsed from the Tcl file, whereas `man` commands are parsed from the README file. ## CI tests These two tests ensure that the documents and top-level Tcl files are formatted properly to catch manpage extraction or compilation errors. - Tcl Syntax Parser [code](man_tcl_params.py) - Readme Syntax Parser [code]() ## New Test Checklist Adding a new test called `func`, you must create/update the following: - `func.py|tcl`: Test script. - `func.ok`: Log output of the test. - `.*ok`: Ideal file output of the test (can be `def`, `lef` etc). - `regression_tests.tcl`: Update the name of the test. In this case, `func`. ## Authors Jack Luar (Advisor: Cho Moon) ## License BSD 3-Clause License. See [LICENSE](../../../LICENSE) file. # README2.html.md # OpenROAD [![Build Status](https://jenkins.openroad.tools/buildStatus/icon?job=OpenROAD-Public%2Fmaster)](https://jenkins.openroad.tools/job/OpenROAD-Public/job/master/) [![Coverity Scan Status](https://scan.coverity.com/projects/the-openroad-project-openroad/badge.svg)](https://scan.coverity.com/projects/the-openroad-project-openroad) [![Documentation Status](https://readthedocs.org/projects/openroad/badge/?version=latest)](https://openroad.readthedocs.io/en/latest/?badge=latest) [![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/5370/badge)](https://bestpractices.coreinfrastructure.org/en/projects/5370) ## About OpenROAD OpenROAD is the leading open-source, foundational application for semiconductor digital design. The OpenROAD flow delivers an Autonomous, No-Human-In-Loop (NHIL) flow, 24 hour turnaround from RTL-GDSII for rapid design exploration and physical design implementation. ## OpenROAD Mission [OpenROAD](https://theopenroadproject.org/) eliminates the barriers of cost, schedule risk and uncertainty in hardware design to promote open access to rapid, low-cost IC design software and expertise and system innovation. The OpenROAD application enables flexible flow control through an API with bindings in Tcl and Python. OpenROAD is used in research and commercial applications such as, - [OpenROAD-flow-scripts](https://github.com/The-OpenROAD-Project/OpenROAD-flow-scripts) from [OpenROAD](https://theopenroadproject.org/) - [OpenLane](https://github.com/The-OpenROAD-Project/OpenLane) from [Efabless](https://efabless.com/) - [Silicon Compiler](https://github.com/siliconcompiler/siliconcompiler) from [Zero ASIC](https://www.zeroasic.com/) - [Hammer](https://docs.hammer-eda.org/en/latest/Examples/openroad-nangate45.html) from [UC Berkeley](https://github.com/ucb-bar) - [OpenFASoC](https://github.com/idea-fasoc/OpenFASOC) from [IDEA-FASoC](https://github.com/idea-fasoc) for mixed-signal design flows OpenROAD fosters a vibrant ecosystem of users through active collaboration and partnership through software development and key alliances. Our growing user community includes hardware designers, software engineers, industry collaborators, VLSI enthusiasts, students and researchers. OpenROAD strongly advocates and enables IC design-based education and workforce development initiatives through training content and courses across several global universities, the Google-SkyWater [shuttles](https://platform.efabless.com/projects/public) also includes GlobalFoundries shuttles, design contests and IC design workshops. The OpenROAD flow has been successfully used to date in over 600 silicon-ready tapeouts for technologies up to 12nm. ## Getting Started with OpenROAD-flow-scripts OpenROAD provides [OpenROAD-flow-scripts](https://github.com/The-OpenROAD-Project/OpenROAD-flow-scripts) as a native, ready-to-use prototyping and tapeout flow. However, it also enables the creation of any custom flow controllers based on the underlying tools, database and analysis engines. Please refer to the flow documentation [here](https://openroad-flow-scripts.readthedocs.io/en/latest/). OpenROAD-flow-scripts (ORFS) is a fully autonomous, RTL-GDSII flow for rapid architecture and design space exploration, early prediction of QoR and detailed physical design implementation. However, ORFS also enables manual intervention for finer user control of individual flow stages through Tcl commands and Python APIs. Figure below shows the main stages of the OpenROAD-flow-scripts: Here are the main steps for a physical design implementation using OpenROAD; - `Floorplanning` - Floorplan initialization - define the chip area, utilization - IO pin placement (for designs without pads) - Tap cell and well tie insertion - PDN- power distribution network creation - `Global Placement` - Macro placement (RAMs, embedded macros) - Standard cell placement - Automatic placement optimization and repair for max slew, max capacitance, and max fanout violations and long wires - `Detailed Placement` - Legalize placement - align to grid, adhere to design rules - Incremental timing analysis for early estimates - `Clock Tree Synthesis` - Insert buffers and resize for high fanout nets - `Optimize setup/hold timing` - `Global Routing` - Antenna repair - Create routing guides - `Detailed Routing` - Legalize routes, DRC-correct routing to meet timing, power constraints - `Chip Finishing` - Parasitic extraction using OpenRCX - Final timing verification - Final physical verification - Dummy metal fill for manufacturability - Use KLayout or Magic using generated GDS for DRC signoff ### GUI The OpenROAD GUI is a powerful visualization, analysis, and debugging tool with a customizable Tcl interface. The below figures show GUI views for various flow stages including floorplanning, placement congestion, CTS and post-routed design. #### Floorplan ![ibex_floorplan.webp](main/docs/images/ibex_floorplan.webp) #### Automatic Hierarchical Macro Placement ![Ariane133](main/docs/images/ariane133_mpl2.webp) #### Placement Congestion Visualization ![pl_congestion.webp](main/docs/images/pl_congestion.webp) #### CTS ![clk_routing.webp](main/docs/images/clk_routing.webp) #### Routing ![ibex_routing.webp](main/docs/images/ibex_routing.webp) ### PDK Support The OpenROAD application is PDK independent. However, it has been tested and validated with specific PDKs in the context of various flow controllers. OpenLane supports SkyWater 130nm and GlobalFoundries 180nm. OpenROAD-flow-scripts supports several public and private PDKs including: #### Open-Source PDKs - `GF180` - 180nm - `SKY130` - 130nm - `Nangate45` - 45nm - `ASAP7` - Predictive FinFET 7nm #### Proprietary PDKs These PDKS are supported in OpenROAD-flow-scripts only. They are used to test and calibrate OpenROAD against commercial platforms and ensure good QoR. The PDKs and platform-specific files for these kits cannot be provided due to NDA restrictions. However, if you are able to access these platforms independently, you can create the necessary platform-specific files yourself. - `GF55` - 55nm - `GF12` - 12nm - `Intel22` - 22nm - `Intel16` - 16nm - `TSMC65` - 65nm ## Tapeouts OpenROAD has been used for full physical implementation in over 600 tapeouts in SKY130 and GF180 through the Google-sponsored, Efabless [MPW shuttle](https://efabless.com/open_shuttle_program) and [ChipIgnite](https://efabless.com/) programs. ![shuttle.webp](main/docs/images/shuttle.webp) ### OpenTitan SoC on GF12LP - Physical design and optimization using OpenROAD ![OpenTitan_SoC.webp](main/docs/images/OpenTitan_SoC.webp) ### Continuous Tapeout Integration into CI The OpenROAD project actively adds successfully taped out MPW shuttle designs to the [CI regression testing](https://github.com/The-OpenROAD-Project/OpenLane-MPW-CI). Examples of designs include Open processor cores, RISC-V based SoCs, cryptocurrency miners, robotic app processors, amateur satellite radio transceivers, OpenPower-based Microwatt etc. ## Build OpenROAD To build OpenROAD tools locally on your machine, follow steps from [here](../user/Build.md). ### Third-party dependencies: submodules vs. Bazel BCR OpenROAD ships two build systems, and they source third-party code differently: - **CMake**: CMake has no central registry of versioned dependencies, so third-party sources are vendored as git submodules (see `.gitmodules` and the nested `.gitmodules` files under each submodule). Some of these submodules look like forks but are really just pinned upstream trees; they exist so CMake has a directory to point at. These are upstream mirrors — kept as submodules because that is what CMake can consume. - **Bazel**: prefer the idiomatic options, in order: 1. A module from the [Bazel Central Registry](https://registry.bazel.build/) (`bazel_dep` in `MODULE.bazel`). This is the default — pinned, mirrored, reproducible, and no submodule needed. 2. If the dependency is not on BCR, fetch the upstream repository directly with `http_archive` (preferred) or a module extension. For modules that exist on BCR but need a different revision, `git_override` (pinned by commit) or `archive_override` (pinned by URL + SHA256) can be used. Bring a BUILD overlay only when upstream does not ship one. 3. A real fork (with OpenROAD-specific patches) stays as a git submodule because that is also what CMake needs; Bazel then references it via its local path. The rule of thumb: if Bazel can get it from BCR or directly from the upstream repo, do not add a submodule just for Bazel. Submodules are the CMake-side compromise, not the source of truth for Bazel builds. ## Regression Tests There are a set of executable regression test scripts in `./test/`. ```shell # run tests for all tools ./test/regression # run all flow tests ./test/regression flow # run tests ./test/regression # run all -specific unit tests cd src/ ./test/regression # run only for cd src/ ./test/regression ``` The flow tests check results such as worst slack against reference values. Use `report_flow_metrics [test]...` to see all of the metrics. ```text % report_flow_metrics gcd_nangate45 insts area util slack_min slack_max tns_max clk_skew max_slew max_cap max_fanout DPL ANT drv gcd_nangate45 368 564 8.8 0.112 -0.015 -0.1 0.004 0 0 0 0 0 0 ``` To update a failing regression, follow the instructions below: ```tcl # update log files (i.e. *ok) save_ok # update "*.metrics" for tests that use flow test save_flow_metrics # update "*.metrics_limits" files save_flow_metrics_limits ``` ## Run ```text openroad [-help] [-version] [-no_init] [-exit] [-gui] [-threads count|max] [-log file_name] [-db file_name] cmd_file -help show help and exit -version show version and exit -no_init do not read .openroad init file -threads count|max use count threads -no_splash do not show the license splash at startup -exit exit after reading cmd_file -gui start in gui mode -python start with python interpreter [limited to db operations] -log write a log in -db open a .odb database at startup cmd_file source cmd_file ``` OpenROAD sources the Tcl command file `~/.openroad` unless the command line option `-no_init` is specified. OpenROAD then sources the command file `cmd_file` if it is specified on the command line. Unless the `-exit` command line flag is specified, it enters an interactive Tcl command interpreter. A list of the available tools/modules included in the OpenROAD app and their descriptions are available [here](../contrib/Logger.md#openroad-tool-list). ## Git Quickstart OpenROAD uses Git for version control and contributions. Get familiarised with a quickstart tutorial to contribution [here](../contrib/GitGuide.md). ## Understanding Warning and Error Messages Seeing OpenROAD warnings or errors you do not understand? We have compiled a table of all messages and you may potentially find your answer [here](https://openroad.readthedocs.io/en/latest/user/MessagesFinal.html). ## License BSD 3-Clause License. See [LICENSE](LICENSE) file. # ReadmeFormat.html.md # Tool Name The top-level READMEs in each tool folder (`~/OpenROAD/src//README.md`) has to be formatted in this particular manner. For most part, you can copy the format and replace the contents where necessary. ## Commands #### NOTE - Parameters in square brackets `[-param param]` are optional. - Parameters without square brackets `-param2 param2` are required. ### Command ABC #### NOTE Please add a description, even a one-liner will be sufficient to avoid triggering CI errors. The `command_abc` command performs… The developer arguments are… Note for commands, you must adhere to the top-level Tcl definition for the same command. - Arguments: cannot be preceded with dashes - Flags/Keys: verify if it is optional or required, then insert the necessary square brackets. Also, keys have to be followed with a specifier whereas flags only require the `-flag` itself. Place the positional arguments last. ```tcl command_abc -key1 key1 [-flag1] [-flagDev] arg1 ``` Arguments must follow this order and be sorted alphabetically within each category: 1. Mandatory flags 2. Optional flags 3. Positional #### Options | Switch Name | Description | |---------------|--------------------------| | `arg1` | Description for `arg1`. | | `-key1` | Description for `key1`. | | `-flag1` | Description for `flag1`. | #### Developer Arguments If there are some developer arguments you want to highlight to the end user not to worry about - you can park them in the same level below the main `Options` category. | Switch Name | Description | |---------------|----------------------------| | `-flagDev` | Description for `flagDev`. | ## Useful Developer Commands If you are a developer, you might find these useful. More details can be found in the [source file]() or the [swig file](). | Command Name | Description | |---------------------|------------------| | `command_abc_debug` | Debug something. | ## Example scripts Examples scripts demonstrating … ```shell ./test/asdfg.tcl ``` ## Regression tests There are a set of regression tests in `./test`. Refer to this section for more information. Simply run the following script: ```shell ./test/regression ``` ## Limitations ## FAQs Check out [GitHub discussion]() about this tool. ## Authors ## References ## License BSD 3-Clause License. See [LICENSE](../../LICENSE) file. # RoutingFlow.html.md # Detailed Router (DR) State Machine ## Overview This document describes the state machine that controls the detailed routing flow in TritonRoute. The state machine manages the iterative routing process, dynamically switching between different optimization strategies based on the current design rule violations (DRVs) and the effectiveness of recent iterations. ![DR State Machine](main/src/drt/doc/RoutingFlow.png) ## Configuration **THRESHOLD** = 100 (DRV threshold for switching between Optimization and Guides states) ## State Machine Architecture The detailed router uses a four-state machine to manage the routing optimization process. Each state represents a different routing strategy, and transitions between states are triggered by specific conditions related to routing quality, iteration effectiveness, and worker parameter changes. ## States ### 1. Optimization State **Purpose**: Aggressive optimization mode for designs with high DRV counts or requiring comprehensive rerouting. **Characteristics**: - Focuses on reducing design rule violations through intensive optimization - Handles cases requiring complete ripup and reroute (`ripup == ALL`) - Addresses spacing violations that need special handling (`fixing_max_spacing`) ### 2. Guides State **Purpose**: Targeted violation resolution using guide-based worker boundaries to address track assignment and boundary pin issues. **Characteristics**: - Creates worker boundaries based on the guides covering the violations - Uses long thin workers (unlike the typical cubic workers) that follow the guide geometry - Specifically designed to resolve violations caused by: - Bad track assignment solutions - Boundary pin involvement - Provides focused rerouting in problematic regions identified by the routing guides ### 3. Stubborn State **Purpose**: Persistent routing mode for difficult-to-route regions that require repeated attempts. **Characteristics**: - Continues routing attempts on challenging areas - Uses more aggressive rerouting strategies - Helps break deadlocks in routing convergence ### 4. Skip State **Purpose**: Temporary bypass mode that skips certain routing operations when worker parameters remain unchanged and no progress is expected. **Characteristics**: - Avoids redundant routing attempts - Waits for meaningful changes before resuming active routing - Improves overall routing efficiency by skipping futile iterations ## Key Decision Variables ### Design Rule Violations (DRV) - **DRV > THRESHOLD**: High violation count, requires aggressive optimization - **DRV <= THRESHOLD**: Lower violation count, allows standard guide-based routing ### Ripup Strategy - **`ripup == ALL`**: Complete ripup and reroute mode - **`ripup != ALL`**: Incremental ripup mode ### Iteration Effectiveness - **Effective iteration**: Routing improved (e.g., DRV count decreased) - **Ineffective iteration**: No routing improvement observed ### Worker Parameters - Worker parameters control routing behavior (e.g., cost functions, search parameters) - Changes in worker parameters may unlock new routing solutions - Unchanged parameters suggest no new solutions available ### Fixing Max Spacing - Special mode for handling maximum spacing violations - Requires specific optimization strategies ## State Machine Flow ### Typical Convergence Path 1. **Initial Phase** (High DRV): ```default Optimization (DRV reduction) → Optimization → ... → Optimization ``` 2. **Mid-convergence** (DRV decreasing): ```default Optimization → Guides (effective iterations) → Guides → Guides ``` 3. **Fine-tuning** (Low DRV, some stubborn violations): ```default Guides → Stubborn (difficult regions) → Guides ``` 4. **Deadlock handling** (No progress): ```default Stubborn → Skip (waiting for parameter changes) Skip → Guides (parameter change triggers retry) ``` 5. **Escalation** (Aggressive ripup is required): ```default Guides → Optimization (ripup all triggered) ``` ### Key Code Locations - State machine implementation: `src/drt/src/dr/FlexDRFlow.cpp` # SKILL.html.md # Fix OpenROAD Bug You are fixing a bug related to **$ARGUMENTS**. ## 1. Understand the bug If `$ARGUMENTS` is a GitHub issue number: ```bash gh issue view $ARGUMENTS --repo The-OpenROAD-Project/OpenROAD \ --json title,body,labels,comments ``` Extract from the issue: - **Error string** (e.g. `GPL-0305`, `DRT-0001`) – search for the exact message ID - **Module** – infer from labels or error prefix - **Steps to reproduce** – look for attached scripts, Tcl commands, or tarballs - **Stack trace** – if a crash, identify the faulting function If `$ARGUMENTS` is an error code, search for it directly: ```bash grep -rn "ERROR_CODE" src/MODULE/src/ ``` ## 2. Trace the root cause Follow OpenROAD’s “trace bugs upstream” principle: find where the bad data is **created**, not where it is **reported**. 1. Find the error message source: ```bash grep -rn "ERROR_ID" src/ ``` 2. Read the surrounding code to understand the condition that triggers it 3. Trace the data flow backward – who sets the offending value? 4. Identify the actual bug location (often in a different function/file from where the error is reported) **Critical constraint**: Never modify files under `src/sta/`. OpenSTA is managed upstream. If the root cause is in OpenSTA, report this finding instead of patching it. ## 3. Implement the fix Follow the coding practices in `docs/agents/coding.md`. Pay special attention to `int64_t` for area calculations and removing unreachable code after `error()` or `throw`. ## 4. Create regression test Every bug fix needs a test that reproduces the exact failure mode from the issue (same error code, same stack frame, same condition) so a future regression is caught immediately. Use the **add-test** skill (`.agents/skills/add-test/SKILL.md`) for the full workflow: writing the test, generating golden files, and registering in both CMake and Bazel. ## 5. Format and commit ```bash # Format changed C++ files (NEVER format src/sta/* or *.i files) clang-format -i # Stage and commit with DCO sign-off git add git commit -s -m "MODULE: fix BRIEF_DESCRIPTION Fixes #ISSUE_NUMBER" ``` ## 6. Verify - Test passes: `cd src/MODULE/test && ./regression -R TEST_NAME` - No unintended changes: `git diff HEAD` - Test registered in both CMake and Bazel - No `src/sta/` files modified - C++ files formatted with clang-format - Commit is signed off (`-s`) # SKILL.html.md # Review OpenROAD Pull Request You are reviewing PR **$ARGUMENTS**. `$ARGUMENTS` may be either: - A bare PR number (e.g. `10062`) - A full GitHub PR URL (e.g. `https://github.com/The-OpenROAD-Project/OpenROAD/pull/10062`) **Normalize first.** Before running any `gh` command, decide what `$ARGUMENTS` is and bind two shell variables: - If `$ARGUMENTS` is a bare number: `PR=$ARGUMENTS` and `REPO=The-OpenROAD-Project/OpenROAD`. - If `$ARGUMENTS` is a URL: extract the trailing number into `PR`, and extract `/` from the URL path into `REPO`. This matters because URLs from forks (or any non-canonical mirror) point at a different repo, and passing `--repo The-OpenROAD-Project/OpenROAD` with such a URL silently mismatches. ## 1. Fetch PR context ```bash gh pr view "$PR" --repo "$REPO" \ --json title,body,labels,files,additions,deletions,baseRefName gh pr diff "$PR" --repo "$REPO" ``` Identify: - **Modules affected** – from file paths (e.g., `src/rsz/` = resizer) - **Change type** – bug fix, feature, refactor, test, docs - **Scope** – number of files and lines changed ## 2. Review by priority order Follow CONTRIBUTING.md review priorities exactly. Spend most effort on the top priorities and less on lower ones. ### Priority 1: Correctness (most important) Flag any code that could silently produce wrong output. An explicit error is always preferable to silently incorrect behavior. Check for: - **Iterator invalidation** – modifying a container while iterating - **Use-after-free** – especially with ODB objects that may be deleted - **Off-by-one errors** – in loop bounds, coordinate calculations - **Integer overflow** – area calculations must use `int64_t` - **Null pointer dereference** – but don’t add overly defensive checks for objects that cannot be null - **Unreachable code** – code after `error()` or `throw` should be removed - **Suppressed tests** – if a test is disabled, ask whether it hides a bug - **`src/sta/` modifications** – these files must NOT be modified (OpenSTA is managed upstream) ### Priority 2: QoR Impact Any change affecting placement, routing, timing, or physical design: - Ask: “Does this have a QoR impact?” - QoR-affecting changes need validation on real designs, not just unit tests - Be skeptical of improvements claimed from a single design ### Priority 3: Testing - Does every code change have an accompanying test? - Are tests registered in **both CMake and Bazel**? - Do golden files look reasonable? - Are test inputs minimal? ### Priority 4: Architecture - OpenROAD is single-process, single-database - Watch for memory cost in heavily-instantiated classes (`dbITerm`, etc.) - Check ODB schema changes require a revision bump ### Priority 5: Style Don’t flag issues handled by `clang-format` or `clang-tidy`. Only flag: - Missing `const` qualifiers - C-style casts (should use C++ casts) - Missing braces on single-line statements - Functions exceeding 100 lines ### Priority 6: Process - PR focused on one bug or feature? - Style fixes in separate commits? - References an open issue for non-trivial changes? ## 3. Draft the review locally (do not post to GitHub) **Important:** This skill never posts comments to GitHub. AI-generated review comments can be noisy or wrong, and posting them directly to a public PR creates work for maintainers and erodes trust in human review. The human reviewer must read your draft, edit it, and decide what (if anything) to submit. Print your draft review to the terminal for the human to inspect. Use this format so it is easy to copy specific items into the GitHub UI: ```default PR #: Modules: <list> == Priority 1 (correctness) == - <file>:<line> bug: <one-line description> - <file>:<line> question: <one-line question> == Priority 2 (QoR) == - <file>:<line> question: does this affect placement/routing/timing on real designs? == Priority 3 (testing) == - <observation about test coverage, dual-registration, golden files> == Priority 4-6 (architecture / style / process) == - <only if material -- skip what clang-format/clang-tidy already covers> == Overall == - <one or two sentences: LGTM, needs changes, or questions before approval> ``` ### Drafting style **Be concise.** One-word or one-sentence items when the issue is clear (e.g., “const”, “unreachable after throw”, “`int64_t` for area”). **Ask probing questions** for non-obvious issues rather than prescribing fixes: - “Have you tested this on a real design?” - “Could this hide a bug?” - “What happens if this is null?” **Lead with severity**: `bug:`, `nit:`, `question:`, `suggestion:`. **Group related issues** rather than listing each line separately. **Don’t generate PR summaries** unless asked. **Do not flag** issues already handled by `clang-format` or `clang-tidy`. If the PR is clean, say so briefly: “LGTM – correctness and testing look solid.” After printing the draft, stop. Do **not** call `gh pr review`, `gh pr comment`, `gh api .../comments`, or any other command that posts to the PR. The human will copy what they want into the GitHub web UI. # SKILL.html.md # Triage OpenROAD Issue You are triaging OpenROAD issue **$ARGUMENTS**. ## 1. Fetch issue details ```bash gh issue view $ARGUMENTS --repo The-OpenROAD-Project/OpenROAD \ --json title,body,labels,state,comments ``` Look for: - Error string (e.g. `GPL-0305`, `GPL-0307`, `DRT-XXXX`) - Attached tarball URL (from `make *_issue`) - OpenROAD version the bug was reported against ## 2. Download and extract artifact Download any `.tar.gz` attached to the issue body or comments. Extract into a working directory: ```bash mkdir -p /tmp/triage-$ARGUMENTS cd /tmp/triage-$ARGUMENTS tar xzf <downloaded-tarball> cd <extracted-dir> ``` ## 3. Fix the run script The `run-me-*.sh` scripts from `make *_issue` often need two fixes: ```bash # Add set -e to exit on error sed -i '2i set -e' run-me-*.sh # Add -exit so openroad exits after the tcl script sed -i 's/openroad -no_init/openroad -exit -no_init/g' run-me-*.sh sed -i 's/openroad -no_splash/openroad -exit -no_splash/g' run-me-*.sh ``` ## 4. Build OpenROAD Build from the OpenROAD source tree: ```bash cd <path-to>/OpenROAD bazelisk build :openroad ``` The binary is at `bazel-bin/openroad`. Export it: ```bash export OPENROAD_EXE=$(pwd)/bazel-bin/openroad ``` ## 5. Reproduce the bug Run the step command and confirm the error string appears: ```bash cd /tmp/triage-$ARGUMENTS/<extracted-dir> ./run-me-*.sh 2>&1 | tee reproduce.log grep -c "<error-string>" reproduce.log ``` If the bug does NOT reproduce with the latest OpenROAD, report this on the issue – the bug may have been fixed. ## 6. Run whittle.py ```bash python3 <path-to>/OpenROAD/etc/whittle.py \ --error_string "<error-string>" \ --base_db_path <path-to>.odb \ --use_stdout --exit_early_on_error \ --step "./run-me-*.sh" \ --persistence 3 --multiplier 2 ``` ### Monitoring progress Watch the `[whittle]` lines. Key things to check: - **ETA growing?** The design may be too large for the current persistence level. Try `--persistence 1` for a coarse first pass. - **.odb size not shrinking?** The error may depend on most of the design. Try increasing `--multiplier`. - **Step timeout too long?** Use `--timeout 300` to cap each step at 5 minutes. - **After 5 minutes** of a step, whittle.py shows the tail of the step’s log so you can see what it is doing. ### When to abort - If after 20+ steps the .odb size has not changed, abort and try different parameters. - If the step itself takes >10 minutes, consider whether the error string is specific enough (avoid generic strings like “ERROR”). ## 7. Upload results Create a new tarball with the whittled .odb: ```bash cp whittle_base_result_*.odb <original-odb-path> tar czf whittled-$ARGUMENTS.tar.gz <extracted-dir>/ ``` Comment on the issue with before/after stats: ```bash gh issue comment $ARGUMENTS --repo The-OpenROAD-Project/OpenROAD \ --body "Whittled test case: original NNN insts -> MMM insts, \ .odb size: XXX MB -> YYY MB. Attached whittled tarball." ``` Upload the tarball to the issue comment via the GitHub web UI (gh CLI does not support file attachments on comments). # SKILL.html.md # Add Test to OpenROAD Module You are adding tests for: **$ARGUMENTS** ## 1. Identify the module and scope Parse `$ARGUMENTS` to determine: - **Module name** (e.g., `rsz`, `drt`, `gpl`) - **What to test** (specific feature, edge case, or general coverage) Explore existing tests to understand conventions: ```bash ls src/MODULE/test/*.tcl | head -20 ``` Read a representative test for the module’s style: ```bash # Good reference for integration test patterns: cat src/rsz/test/repair_tie12_hier.tcl ``` ## 2. Write the integration test (Tcl) Create `src/MODULE/test/TEST_NAME.tcl`: ```tcl # Brief description of what this test verifies set test_name TEST_NAME source "helpers.tcl" # Read design files read_lef "TECH.lef" read_lef "CELLS.lef" read_def "DESIGN.def" # ... test operations ... # Use make_result_file for temporary output set def_filename "${test_name}.def" set out_def [make_result_file $def_filename] write_def $out_def # Compare against golden file diff_file ${test_name}.defok $out_def ``` ### Test design files Prefer reusing existing test data in `src/MODULE/test/`. Only create new LEF/DEF files when testing a specific geometry or edge case that existing files don’t cover. Keep test data minimal. ### Naming conventions - Test files: `src/MODULE/test/TEST_NAME.tcl` - Golden log: `src/MODULE/test/TEST_NAME.ok` - Golden output: `src/MODULE/test/TEST_NAME.{defok,vok,spefok,...}` - Test data: `src/MODULE/test/*.{lef,def,lib,sdc,v}` ## 3. Generate golden files Run the test and capture output: ```bash cd src/MODULE/test # Run with openroad to generate output openroad -no_splash -no_init -exit TEST_NAME.tcl > TEST_NAME.ok 2>&1 # Remove the openroad banner from the .ok file if present # The .ok file should contain only the test's stdout ``` If the test uses `diff_file`, also generate the golden output file (e.g., `TEST_NAME.defok`) by running once and copying the result file. ## 4. Register in BOTH build systems This is the most common mistake. **Every test must be in both CMake AND Bazel.** CMake-only tests silently pass locally but are missing from Bazel CI. ### CMake – `src/MODULE/test/CMakeLists.txt` Find the `or_integration_tests()` call. The first positional argument is the **module name**, followed by the `TESTS` keyword and the list: ```cmake or_integration_tests( "MODULE" # <-- module name (e.g. "rsz") TESTS existing_test1 existing_test2 TEST_NAME # <-- add here ) ``` Some modules also have a `PASSFAIL_TESTS` section after `TESTS` – add to the appropriate list. Look at the module’s existing `CMakeLists.txt` before editing. ### Bazel – `src/MODULE/test/BUILD` The typical pattern is a `TESTS` list consumed by a list comprehension that calls `regression_test()` for each name: ```python TESTS = [ "buffer_ports1", "buffer_ports10", "buffer_ports11", "TEST_NAME", # <-- add here, in the existing sort order # (other tests omitted) ] [ regression_test( name = test_name, ) for test_name in TESTS ] ``` Some modules split tests across multiple lists (`TESTS`, `PASSFAIL_TESTS`, `BIG_TESTS`, etc.) and define a combined `ALL_TESTS = TESTS + PASSFAIL_TESTS + ...` that the comprehension iterates over. Read the existing `BUILD` to find which list to extend, and insert the new test name in whatever sort order that file already uses (most modules are alphabetical). ## 5. Write unit tests (C++, if applicable) Prefer C++ unit tests over Tcl for testing internal logic, algorithms, and data structure operations. Use Tcl integration tests for command-level behavior and end-to-end flows. ### Test file Create `src/MODULE/test/cpp/TestName.cpp`: ```cpp #include "gtest/gtest.h" #include "odb/db.h" // Simple test (no fixture) namespace module { namespace { TEST(ModuleTest, TestDescription) { // ARRANGE - ACT - ASSERT EXPECT_EQ(expected, actual); } } // namespace } // namespace module ``` ### Using test fixtures OpenROAD provides a fixture hierarchy for tests that need database or tool setup. Choose the simplest one that covers your needs: | Fixture | Use when | |--------------------------|--------------------------------------------------| | `tst::Fixture` | Need bare `dbDatabase` + STA, load LEFs manually | | `tst::Nangate45Fixture` | Need pre-loaded Nangate45 tech/lib | | `tst::Sky130Fixture` | Need pre-loaded Sky130 tech/lib | | `tst::IntegratedFixture` | Need full tool integration (STA, DPL, GRT, RSZ) | ```cpp #include "gtest/gtest.h" #include "tst/nangate45_fixture.h" class TestFeature : public tst::Nangate45Fixture { protected: void SetUp() override { /* additional setup */ } }; TEST_F(TestFeature, HandlesEdgeCase) { // block_, lib_ are available from the fixture EXPECT_TRUE(condition); } ``` ### CMake registration – `src/MODULE/test/cpp/CMakeLists.txt` ```cmake add_executable(TestName TestName.cpp) target_link_libraries(TestName MODULE_lib GTest::gtest GTest::gtest_main tst odb ) gtest_discover_tests(TestName WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/.. ) add_dependencies(build_and_test TestName) ``` ### Bazel registration – `src/MODULE/test/BUILD` Add the `cc_test` target alongside the existing `regression_test` entries. Most modules keep C++ tests in the same BUILD file: ```python load("@rules_cc//cc:cc_test.bzl", "cc_test") cc_test( name = "TestName", srcs = ["cpp/TestName.cpp"], deps = [ "//src/MODULE", "//src/tst", "//src/tst:nangate45_fixture", # if using Nangate45Fixture "@googletest//:gtest", "@googletest//:gtest_main", ], ) ``` ## 6. Run and verify `./regression` is a thin ctest wrapper that filters by module label, so the standard ctest flags apply. Use `-R` to match a single test by name: ```bash cd src/MODULE/test ./regression -R TEST_NAME # Verify test is discoverable in both systems cd ../../../build ctest -N | grep MODULE.*TEST_NAME ``` ## 7. Format and commit ```bash # Format any C++ files (NEVER format src/sta/* or *.i files) clang-format -i <changed-cpp-files> git add src/MODULE/test/TEST_NAME.tcl \ src/MODULE/test/TEST_NAME.ok \ src/MODULE/test/CMakeLists.txt \ src/MODULE/test/BUILD git commit -s -m "MODULE: add TEST_NAME test Test for DESCRIPTION." ``` ## Checklist - <input class="task-list-item-checkbox" disabled="disabled" type="checkbox"> Test runs successfully: `./regression -R TEST_NAME` - <input class="task-list-item-checkbox" disabled="disabled" type="checkbox"> Golden file generated and committed - <input class="task-list-item-checkbox" disabled="disabled" type="checkbox"> Registered in CMake `CMakeLists.txt` - <input class="task-list-item-checkbox" disabled="disabled" type="checkbox"> Registered in Bazel `BUILD` - <input class="task-list-item-checkbox" disabled="disabled" type="checkbox"> Test data is minimal (reuse existing files when possible) - <input class="task-list-item-checkbox" disabled="disabled" type="checkbox"> C++ files formatted with clang-format - <input class="task-list-item-checkbox" disabled="disabled" type="checkbox"> Commit is signed off (`-s`) # SKILL.html.md # Fix OpenROAD Bug You are fixing a bug related to **$ARGUMENTS**. ## 1. Understand the bug If `$ARGUMENTS` is a GitHub issue number: ```bash gh issue view $ARGUMENTS --repo The-OpenROAD-Project/OpenROAD \ --json title,body,labels,comments ``` Extract from the issue: - **Error string** (e.g. `GPL-0305`, `DRT-0001`) – search for the exact message ID - **Module** – infer from labels or error prefix - **Steps to reproduce** – look for attached scripts, Tcl commands, or tarballs - **Stack trace** – if a crash, identify the faulting function If `$ARGUMENTS` is an error code, search for it directly: ```bash grep -rn "ERROR_CODE" src/MODULE/src/ ``` ## 2. Trace the root cause Follow OpenROAD’s “trace bugs upstream” principle: find where the bad data is **created**, not where it is **reported**. 1. Find the error message source: ```bash grep -rn "ERROR_ID" src/ ``` 2. Read the surrounding code to understand the condition that triggers it 3. Trace the data flow backward – who sets the offending value? 4. Identify the actual bug location (often in a different function/file from where the error is reported) **Critical constraint**: Never modify files under `src/sta/`. OpenSTA is managed upstream. If the root cause is in OpenSTA, report this finding instead of patching it. ## 3. Implement the fix Follow the coding practices in `docs/agents/coding.md`. Pay special attention to `int64_t` for area calculations and removing unreachable code after `error()` or `throw`. ## 4. Create regression test Every bug fix needs a test that reproduces the exact failure mode from the issue (same error code, same stack frame, same condition) so a future regression is caught immediately. Use the **add-test** skill (`.agents/skills/add-test/SKILL.md`) for the full workflow: writing the test, generating golden files, and registering in both CMake and Bazel. ## 5. Format and commit ```bash # Format changed C++ files (NEVER format src/sta/* or *.i files) clang-format -i <changed-cpp-files> # Stage and commit with DCO sign-off git add <changed-files> git commit -s -m "MODULE: fix BRIEF_DESCRIPTION Fixes #ISSUE_NUMBER" ``` ## 6. Verify - <input class="task-list-item-checkbox" disabled="disabled" type="checkbox"> Test passes: `cd src/MODULE/test && ./regression -R TEST_NAME` - <input class="task-list-item-checkbox" disabled="disabled" type="checkbox"> No unintended changes: `git diff HEAD` - <input class="task-list-item-checkbox" disabled="disabled" type="checkbox"> Test registered in both CMake and Bazel - <input class="task-list-item-checkbox" disabled="disabled" type="checkbox"> No `src/sta/` files modified - <input class="task-list-item-checkbox" disabled="disabled" type="checkbox"> C++ files formatted with clang-format - <input class="task-list-item-checkbox" disabled="disabled" type="checkbox"> Commit is signed off (`-s`) # SKILL.html.md # Review OpenROAD Pull Request You are reviewing PR **$ARGUMENTS**. `$ARGUMENTS` may be either: - A bare PR number (e.g. `10062`) - A full GitHub PR URL (e.g. `https://github.com/The-OpenROAD-Project/OpenROAD/pull/10062`) **Normalize first.** Before running any `gh` command, decide what `$ARGUMENTS` is and bind two shell variables: - If `$ARGUMENTS` is a bare number: `PR=$ARGUMENTS` and `REPO=The-OpenROAD-Project/OpenROAD`. - If `$ARGUMENTS` is a URL: extract the trailing number into `PR`, and extract `<owner>/<repo>` from the URL path into `REPO`. This matters because URLs from forks (or any non-canonical mirror) point at a different repo, and passing `--repo The-OpenROAD-Project/OpenROAD` with such a URL silently mismatches. ## 1. Fetch PR context ```bash gh pr view "$PR" --repo "$REPO" \ --json title,body,labels,files,additions,deletions,baseRefName gh pr diff "$PR" --repo "$REPO" ``` Identify: - **Modules affected** – from file paths (e.g., `src/rsz/` = resizer) - **Change type** – bug fix, feature, refactor, test, docs - **Scope** – number of files and lines changed ## 2. Review by priority order Follow CONTRIBUTING.md review priorities exactly. Spend most effort on the top priorities and less on lower ones. ### Priority 1: Correctness (most important) Flag any code that could silently produce wrong output. An explicit error is always preferable to silently incorrect behavior. Check for: - **Iterator invalidation** – modifying a container while iterating - **Use-after-free** – especially with ODB objects that may be deleted - **Off-by-one errors** – in loop bounds, coordinate calculations - **Integer overflow** – area calculations must use `int64_t` - **Null pointer dereference** – but don’t add overly defensive checks for objects that cannot be null - **Unreachable code** – code after `error()` or `throw` should be removed - **Suppressed tests** – if a test is disabled, ask whether it hides a bug - **`src/sta/` modifications** – these files must NOT be modified (OpenSTA is managed upstream) ### Priority 2: QoR Impact Any change affecting placement, routing, timing, or physical design: - Ask: “Does this have a QoR impact?” - QoR-affecting changes need validation on real designs, not just unit tests - Be skeptical of improvements claimed from a single design ### Priority 3: Testing - Does every code change have an accompanying test? - Are tests registered in **both CMake and Bazel**? - Do golden files look reasonable? - Are test inputs minimal? ### Priority 4: Architecture - OpenROAD is single-process, single-database - Watch for memory cost in heavily-instantiated classes (`dbITerm`, etc.) - Check ODB schema changes require a revision bump ### Priority 5: Style Don’t flag issues handled by `clang-format` or `clang-tidy`. Only flag: - Missing `const` qualifiers - C-style casts (should use C++ casts) - Missing braces on single-line statements - Functions exceeding 100 lines ### Priority 6: Process - PR focused on one bug or feature? - Style fixes in separate commits? - References an open issue for non-trivial changes? ## 3. Draft the review locally (do not post to GitHub) **Important:** This skill never posts comments to GitHub. AI-generated review comments can be noisy or wrong, and posting them directly to a public PR creates work for maintainers and erodes trust in human review. The human reviewer must read your draft, edit it, and decide what (if anything) to submit. Print your draft review to the terminal for the human to inspect. Use this format so it is easy to copy specific items into the GitHub UI: ```default PR #<num>: <title> Modules: <list> == Priority 1 (correctness) == - <file>:<line> bug: <one-line description> - <file>:<line> question: <one-line question> == Priority 2 (QoR) == - <file>:<line> question: does this affect placement/routing/timing on real designs? == Priority 3 (testing) == - <observation about test coverage, dual-registration, golden files> == Priority 4-6 (architecture / style / process) == - <only if material -- skip what clang-format/clang-tidy already covers> == Overall == - <one or two sentences: LGTM, needs changes, or questions before approval> ``` ### Drafting style **Be concise.** One-word or one-sentence items when the issue is clear (e.g., “const”, “unreachable after throw”, “`int64_t` for area”). **Ask probing questions** for non-obvious issues rather than prescribing fixes: - “Have you tested this on a real design?” - “Could this hide a bug?” - “What happens if this is null?” **Lead with severity**: `bug:`, `nit:`, `question:`, `suggestion:`. **Group related issues** rather than listing each line separately. **Don’t generate PR summaries** unless asked. **Do not flag** issues already handled by `clang-format` or `clang-tidy`. If the PR is clean, say so briefly: “LGTM – correctness and testing look solid.” After printing the draft, stop. Do **not** call `gh pr review`, `gh pr comment`, `gh api .../comments`, or any other command that posts to the PR. The human will copy what they want into the GitHub web UI. # SKILL.html.md # Triage OpenROAD Issue You are triaging OpenROAD issue **$ARGUMENTS**. ## 1. Fetch issue details ```bash gh issue view $ARGUMENTS --repo The-OpenROAD-Project/OpenROAD \ --json title,body,labels,state,comments ``` Look for: - Error string (e.g. `GPL-0305`, `GPL-0307`, `DRT-XXXX`) - Attached tarball URL (from `make *_issue`) - OpenROAD version the bug was reported against ## 2. Download and extract artifact Download any `.tar.gz` attached to the issue body or comments. Extract into a working directory: ```bash mkdir -p /tmp/triage-$ARGUMENTS cd /tmp/triage-$ARGUMENTS tar xzf <downloaded-tarball> cd <extracted-dir> ``` ## 3. Fix the run script The `run-me-*.sh` scripts from `make *_issue` often need two fixes: ```bash # Add set -e to exit on error sed -i '2i set -e' run-me-*.sh # Add -exit so openroad exits after the tcl script sed -i 's/openroad -no_init/openroad -exit -no_init/g' run-me-*.sh sed -i 's/openroad -no_splash/openroad -exit -no_splash/g' run-me-*.sh ``` ## 4. Build OpenROAD Build from the OpenROAD source tree: ```bash cd <path-to>/OpenROAD bazelisk build :openroad ``` The binary is at `bazel-bin/openroad`. Export it: ```bash export OPENROAD_EXE=$(pwd)/bazel-bin/openroad ``` ## 5. Reproduce the bug Run the step command and confirm the error string appears: ```bash cd /tmp/triage-$ARGUMENTS/<extracted-dir> ./run-me-*.sh 2>&1 | tee reproduce.log grep -c "<error-string>" reproduce.log ``` If the bug does NOT reproduce with the latest OpenROAD, report this on the issue – the bug may have been fixed. ## 6. Run whittle.py ```bash python3 <path-to>/OpenROAD/etc/whittle.py \ --error_string "<error-string>" \ --base_db_path <path-to>.odb \ --use_stdout --exit_early_on_error \ --step "./run-me-*.sh" \ --persistence 3 --multiplier 2 ``` ### Monitoring progress Watch the `[whittle]` lines. Key things to check: - **ETA growing?** The design may be too large for the current persistence level. Try `--persistence 1` for a coarse first pass. - **.odb size not shrinking?** The error may depend on most of the design. Try increasing `--multiplier`. - **Step timeout too long?** Use `--timeout 300` to cap each step at 5 minutes. - **After 5 minutes** of a step, whittle.py shows the tail of the step’s log so you can see what it is doing. ### When to abort - If after 20+ steps the .odb size has not changed, abort and try different parameters. - If the step itself takes >10 minutes, consider whether the error string is specific enough (avoid generic strings like “ERROR”). ## 7. Upload results Create a new tarball with the whittled .odb: ```bash cp whittle_base_result_*.odb <original-odb-path> tar czf whittled-$ARGUMENTS.tar.gz <extracted-dir>/ ``` Comment on the issue with before/after stats: ```bash gh issue comment $ARGUMENTS --repo The-OpenROAD-Project/OpenROAD \ --body "Whittled test case: original NNN insts -> MMM insts, \ .odb size: XXX MB -> YYY MB. Attached whittled tarball." ``` Upload the tarball to the issue comment via the GitHub web UI (gh CLI does not support file attachments on comments). # SKILL.html.md # Add Test to OpenROAD Module You are adding tests for: **$ARGUMENTS** ## 1. Identify the module and scope Parse `$ARGUMENTS` to determine: - **Module name** (e.g., `rsz`, `drt`, `gpl`) - **What to test** (specific feature, edge case, or general coverage) Explore existing tests to understand conventions: ```bash ls src/MODULE/test/*.tcl | head -20 ``` Read a representative test for the module’s style: ```bash # Good reference for integration test patterns: cat src/rsz/test/repair_tie12_hier.tcl ``` ## 2. Write the integration test (Tcl) Create `src/MODULE/test/TEST_NAME.tcl`: ```tcl # Brief description of what this test verifies set test_name TEST_NAME source "helpers.tcl" # Read design files read_lef "TECH.lef" read_lef "CELLS.lef" read_def "DESIGN.def" # ... test operations ... # Use make_result_file for temporary output set def_filename "${test_name}.def" set out_def [make_result_file $def_filename] write_def $out_def # Compare against golden file diff_file ${test_name}.defok $out_def ``` ### Test design files Prefer reusing existing test data in `src/MODULE/test/`. Only create new LEF/DEF files when testing a specific geometry or edge case that existing files don’t cover. Keep test data minimal. ### Naming conventions - Test files: `src/MODULE/test/TEST_NAME.tcl` - Golden log: `src/MODULE/test/TEST_NAME.ok` - Golden output: `src/MODULE/test/TEST_NAME.{defok,vok,spefok,...}` - Test data: `src/MODULE/test/*.{lef,def,lib,sdc,v}` ## 3. Generate golden files Run the test and capture output: ```bash cd src/MODULE/test # Run with openroad to generate output openroad -no_splash -no_init -exit TEST_NAME.tcl > TEST_NAME.ok 2>&1 # Remove the openroad banner from the .ok file if present # The .ok file should contain only the test's stdout ``` If the test uses `diff_file`, also generate the golden output file (e.g., `TEST_NAME.defok`) by running once and copying the result file. ## 4. Register in BOTH build systems This is the most common mistake. **Every test must be in both CMake AND Bazel.** CMake-only tests silently pass locally but are missing from Bazel CI. ### CMake – `src/MODULE/test/CMakeLists.txt` Find the `or_integration_tests()` call. The first positional argument is the **module name**, followed by the `TESTS` keyword and the list: ```cmake or_integration_tests( "MODULE" # <-- module name (e.g. "rsz") TESTS existing_test1 existing_test2 TEST_NAME # <-- add here ) ``` Some modules also have a `PASSFAIL_TESTS` section after `TESTS` – add to the appropriate list. Look at the module’s existing `CMakeLists.txt` before editing. ### Bazel – `src/MODULE/test/BUILD` The typical pattern is a `TESTS` list consumed by a list comprehension that calls `regression_test()` for each name: ```python TESTS = [ "buffer_ports1", "buffer_ports10", "buffer_ports11", "TEST_NAME", # <-- add here, in the existing sort order # (other tests omitted) ] [ regression_test( name = test_name, ) for test_name in TESTS ] ``` Some modules split tests across multiple lists (`TESTS`, `PASSFAIL_TESTS`, `BIG_TESTS`, etc.) and define a combined `ALL_TESTS = TESTS + PASSFAIL_TESTS + ...` that the comprehension iterates over. Read the existing `BUILD` to find which list to extend, and insert the new test name in whatever sort order that file already uses (most modules are alphabetical). ## 5. Write unit tests (C++, if applicable) Prefer C++ unit tests over Tcl for testing internal logic, algorithms, and data structure operations. Use Tcl integration tests for command-level behavior and end-to-end flows. ### Test file Create `src/MODULE/test/cpp/TestName.cpp`: ```cpp #include "gtest/gtest.h" #include "odb/db.h" // Simple test (no fixture) namespace module { namespace { TEST(ModuleTest, TestDescription) { // ARRANGE - ACT - ASSERT EXPECT_EQ(expected, actual); } } // namespace } // namespace module ``` ### Using test fixtures OpenROAD provides a fixture hierarchy for tests that need database or tool setup. Choose the simplest one that covers your needs: | Fixture | Use when | |--------------------------|--------------------------------------------------| | `tst::Fixture` | Need bare `dbDatabase` + STA, load LEFs manually | | `tst::Nangate45Fixture` | Need pre-loaded Nangate45 tech/lib | | `tst::Sky130Fixture` | Need pre-loaded Sky130 tech/lib | | `tst::IntegratedFixture` | Need full tool integration (STA, DPL, GRT, RSZ) | ```cpp #include "gtest/gtest.h" #include "tst/nangate45_fixture.h" class TestFeature : public tst::Nangate45Fixture { protected: void SetUp() override { /* additional setup */ } }; TEST_F(TestFeature, HandlesEdgeCase) { // block_, lib_ are available from the fixture EXPECT_TRUE(condition); } ``` ### CMake registration – `src/MODULE/test/cpp/CMakeLists.txt` ```cmake add_executable(TestName TestName.cpp) target_link_libraries(TestName MODULE_lib GTest::gtest GTest::gtest_main tst odb ) gtest_discover_tests(TestName WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/.. ) add_dependencies(build_and_test TestName) ``` ### Bazel registration – `src/MODULE/test/BUILD` Add the `cc_test` target alongside the existing `regression_test` entries. Most modules keep C++ tests in the same BUILD file: ```python load("@rules_cc//cc:cc_test.bzl", "cc_test") cc_test( name = "TestName", srcs = ["cpp/TestName.cpp"], deps = [ "//src/MODULE", "//src/tst", "//src/tst:nangate45_fixture", # if using Nangate45Fixture "@googletest//:gtest", "@googletest//:gtest_main", ], ) ``` ## 6. Run and verify `./regression` is a thin ctest wrapper that filters by module label, so the standard ctest flags apply. Use `-R` to match a single test by name: ```bash cd src/MODULE/test ./regression -R TEST_NAME # Verify test is discoverable in both systems cd ../../../build ctest -N | grep MODULE.*TEST_NAME ``` ## 7. Format and commit ```bash # Format any C++ files (NEVER format src/sta/* or *.i files) clang-format -i <changed-cpp-files> git add src/MODULE/test/TEST_NAME.tcl \ src/MODULE/test/TEST_NAME.ok \ src/MODULE/test/CMakeLists.txt \ src/MODULE/test/BUILD git commit -s -m "MODULE: add TEST_NAME test Test for DESCRIPTION." ``` ## Checklist - <input class="task-list-item-checkbox" disabled="disabled" type="checkbox"> Test runs successfully: `./regression -R TEST_NAME` - <input class="task-list-item-checkbox" disabled="disabled" type="checkbox"> Golden file generated and committed - <input class="task-list-item-checkbox" disabled="disabled" type="checkbox"> Registered in CMake `CMakeLists.txt` - <input class="task-list-item-checkbox" disabled="disabled" type="checkbox"> Registered in Bazel `BUILD` - <input class="task-list-item-checkbox" disabled="disabled" type="checkbox"> Test data is minimal (reuse existing files when possible) - <input class="task-list-item-checkbox" disabled="disabled" type="checkbox"> C++ files formatted with clang-format - <input class="task-list-item-checkbox" disabled="disabled" type="checkbox"> Commit is signed off (`-s`) # TclCommands.html.md # OpenROAD Tcl Usage (global_placement) ```default global_placement [-skip_initial_place] [-incremental] [-bin_grid_count grid_count] [-density density] [-init_density_penalty init_density_penalty] [-init_wirelength_coef init_wirelength_coef] [-min_phi_coef min_phi_coef] [-max_phi_coef max_phi_coef] [-overflow overflow] [-initial_place_max_iter max_iter] [-initial_place_max_fanout max_fanout] [-verbose_level verbose_level] ``` ## Flow Control * **skip_initial_place** : Skip the initial placement (BiCGSTAB solving) before Nesterov placement. IP improves HPWL by ~5% on large designs. * **incremental** : Enable the incremental global placement. Users would need to tune other parameters (e.g. init_density_penalty) with the pre-placed solutions. ## Tuning Parameters * **bin_grid_count** : Set bin grid’s count manually. Default: Defined by internal algorithm. [64,128,256,512,…, int] * **density** : Set target density. Default: 0.70 [0-1, float] * **init_density_penalty** : Set initial density penalty. Default : 8e-5 [1e-6 - 1e6, float] * **min_phi_coef** : Set pcof_min(µ_k Lower Bound). Default: 0.95 [0.95-1.05, float] * **max_phi_coef** : Set pcof_max(µ_k Upper Bound). Default: 1.05 [1.00-1.20, float] * **overflow** : Set target overflow for termination condition. Default: 0.1 [0-1, float] ## Other Options * **verbose_level** [0-10, int] : Set verbose level for RePlAce. Default: 1 Note that all of the TCL commands are defined in the […/src/replace.tcl](https://github.com/The-OpenROAD-Project/OpenROAD/blob/master/src/gpl/src/replace.tcl) and […/src/replace.i](https://github.com/The-OpenROAD-Project/OpenROAD/blob/master/src/gpl/src/replace.i). # TclFormat.html.md # Tcl Format The most important part to take note of are: `sta::define_cmd_args` - which defines what is printed when a user types `help command` in the OR shell; as well as `sta::parse_key_args` - which defines what keys/flags the command actually parses. Let us use `check_antennas` command for an example. ## Specification ```tcl sta::define_cmd_args "check_antennas" { [-verbose]\ [-net net]} proc check_antennas { args } { sta::parse_key_args "check_antennas" args \ keys {-report_file -net} \ flags {-verbose -report_violating_nets} ... } ``` ## Do not compile If you add `;# checker off` behind the command’s `sta::define_cmd_args {} ` and `sta::parse_key_args {}` the function will not be compiled in the Manpages and included in the doctests. ```tcl sta::define_cmd_args "check_antennas" { [-verbose]\ [-net net]} ;# checker off proc check_antennas { args } { sta::parse_key_args "check_antennas" args \ keys {-report_file -net} \ flags {-verbose -report_violating_nets};# checker off ... } ``` # Vsrc_description.html.md # Voltage source location file description This file specifies the description of the C4 bump configurations file. The file is a csv as described below: ```default <x_coordinate>, <y_coordinate>, <octagonal_c4_bump_edge_length>, <voltage_value> ``` The x and y coordinate specify the center location of the voltage C4 bumps in micro meter. The octagonal c4_edge_length specifies the edge length of the C4 to determine the pitch of the RDL layer in micron Voltage_value specifies the value of voltage source at the C4 bump. In case there is a need to specify voltage drop in micron ## Example file ```default 250,250,20,1.1 130,170,20,1.1 370,410,10,1.1 410,450,10,1.1 ``` # architecture.html.md # Resizer Optimization Architecture ## Table Of Contents 1. [Summary]() 2. [Top-Level Flow]() 3. [Phase UI]() 4. [Core Data Model]() 5. [Policy Model]() 6. [Prewarm Stage]() 7. [Prepare Stage]() 8. [Delay Estimator And Reporter]() 9. [Generator And Candidate Model]() 10. [Threading Model]() 11. [File Changes]() 12. [Future Work]() ## Summary Rearchitected `repair_setup` around a policy-driven optimizer. | Area | Change | |---------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Move implementation | Replaced monolithic `*Move` classes with `MoveGenerator` + `MoveCandidate` pairs. | | Phase policy | Added `OptimizationPolicy` and concrete setup-repair phase policies. `repair_timing -phases` selects the ordered phase pipeline. | | MT support | Added common `utl::ThreadPool` and MT-capable policies/generators. | | Prewarm stage | Added policy-level Liberty-cell and driver-cache warmup before target preparation. Required to complete lazy updates and ensure thread safety. | | Prepare stage | Added per-target `ArcDelayState` caching for expensive STA-derived data before MT generation/estimation. Required to reduce redundant computations in MT policies. | | Delay estimator | Added path-window delay estimation for MT size-up/VT-swap scoring, with optional STA slew-bias sampling. | | Estimator reporter | Added a diagnostic command that compares estimator predictions against ECO-journaled STA measurements. | | Scope | The new architecture targets `repair_setup` only. It can be extended to `repair_design`, `repair_hold`, and `recover_power` later. | | Compatibility | `SetupLegacyPolicy` is the default path and is kept close to legacy repair behavior. The QoR goal is ORFS design parity. | | Target model | `Target` exposes path-driver and instance view bits so generators can share one target representation. New views will be added later. | **Overall repair_setup flow** ```default [Optimizer::run()] resizer_.runRepairSetupPreamble() create shared RepairSetupContext phases = parseTokens(-phases or "LEGACY LAST_GASP CRIT_VT_SWAP") for each phase: policy = makePolicyForPhase(phase) policy->start() while (!policy.converged()): policy.iterate() last_policy->finalizeAndReport() [OptimizationPolicy::iterate()] LEGACY / SetupLegacyPolicy: select legacy target -> generate -> estimate -> commit first accepted move <- [ST] MEASURED_VT_SWAP / MeasuredVtSwapPolicy (EXPERIMENTAL): select target -> generate candidates -> measure by ECO journal -> commit best <- [ST] LEGACY_MT / SetupLegacyMtPolicy (EXPERIMENTAL): select legacy target prewarm target vector <- [ST] Liberty/driver-cache warmup prepared_target = prepareTarget(t) <- [ST] target ArcDelayState build candidates = generate(prepared) <- [ST] legacy-order generation estimates = estimate(candidates) <- [MT] only for VtSwap/SizeUp candidates commit(first_or_best_candidate) <- [ST] apply MT1 / SetupMt1Policy (EXPERIMENTAL): select target batch prewarm(targets) <- [ST] Liberty/driver-cache warmup prepareTargets(targets) <- [ST] target ArcDelayState build for each target <- [ST] target-level scheduling candidates = generate(prepared) <- [MT] parallel move-type fanout estimates = estimate(candidates) <- [MT] parallel candidate scoring commit(best_candidates) <- [ST] sequential apply ``` **Key components** ```text Optimizer Owns one repair_setup run Owns MoveCommitter Parses phase tokens and creates one OptimizationPolicy per phase OptimizationPolicy (interface) SetupLegacyPolicy : Reproduces legacy repair-setup behavior SetupWnsPolicy : Legacy WNS phase SetupTnsPolicy : Legacy TNS phase SetupDirectionalPolicy: Legacy endpoint-fanin / startpoint-fanout phases SetupLastGaspPolicy : Legacy last-gasp phase SetupCritVtSwapPolicy : Legacy critical-VT-swap phase SetupLegacyMtPolicy : Legacy phase flow with MT scoring for selected moves MeasuredVtSwapPolicy : Single-threaded VT-swap-only with measured estimate SetupMt1Policy : Batched multi-threaded VT-swap + size-up policy MoveGenerator / MoveCandidate Own move-local legality and ECO plan Decides how to optimize MoveGenerator.isApplicable(): Check if the move is applicable quickly MoveGenerator.generate(): Generate move candidates MoveCandidate.estimate(): Estimate legality and score MoveCandidate.apply(): Apply the move MoveCommitter Owns journal checkpoints, commit/rollback, and move accounting Bridges policy/candidate events to MoveTracker reporting ``` ## Top-Level Flow ```mermaid flowchart TD A[repair_timing -setup] --> B[Tcl parses -phases] B --> C[Resizer::repairSetup] C --> D[Optimizer::configure] D --> E[Optimizer::run] E --> F[RepairSetupContext] E --> G{phase token} G -->|LEGACY| H[SetupLegacyPolicy] G -->|WNS / TNS / directional| I[Legacy phase policies] G -->|LAST_GASP| J[SetupLastGaspPolicy] G -->|CRIT_VT_SWAP| K[SetupCritVtSwapPolicy] G -->|experimental| L[SetupLegacyMtPolicy / SetupMt1Policy / MeasuredVtSwapPolicy] H --> M[MoveGenerator] I --> M J --> M K --> M L --> M M --> N[MoveCandidate] N --> O[MoveCommitter] ``` `Optimizer` is the top-level driver for one `repair_setup` call. ```cpp OptimizerRunConfig config; config.sequence = sequence; config.phases = phases != nullptr ? phases : ""; rsz::Optimizer optimizer(this); optimizer.configure(config); return optimizer.run(); ``` | Step | Owner | Purpose | |---------------|-----------------------------------|------------------------------------------------------------------------------------------------------| | Configure | `Resizer::repairSetup()` | Freeze Tcl/API options into `OptimizerRunConfig`. | | Parse phases | `Optimizer::run()` | Tokenize `config.phases`, or use the default `LEGACY LAST_GASP CRIT_VT_SWAP`. | | Create policy | `Optimizer::makePolicyForPhase()` | Map one phase token to one concrete `OptimizationPolicy`. | | Run policy | `OptimizationPolicy` | Select targets, prewarm/prepare data, generate candidates, estimate, commit, and decide convergence. | | Final report | `OptimizationPolicy` | Emit final progress, move tracker reports, and repair summary after the last phase. | The optimizer does not implement move logic directly. Repair behavior belongs to policies and move implementations. ## Phase UI `repair_timing -phases` is the public UI for selecting the setup-repair phase pipeline. The older spellings `-policy` and `-policies` are accepted aliases with identical semantics, but only `-phases` is listed in command help. Only one of `-phases`, `-policy`, and `-policies` may be supplied in a single command. Tokens are whitespace-separated and matched exactly as shown below. If none is supplied, the default pipeline is: ```tcl repair_timing -setup -phases "LEGACY LAST_GASP CRIT_VT_SWAP" ``` Examples: ```tcl # Default setup repair pipeline. repair_timing -setup # Explicit default pipeline. repair_timing -setup -phases "LEGACY LAST_GASP CRIT_VT_SWAP" # Run selected legacy-compatible phases. repair_timing -setup -phases "WNS TNS LAST_GASP" # Experimental top-level policies are accepted as phase tokens. repair_timing -setup -phases "LEGACY_MT" repair_timing -setup -phases "MT1" # Alias spelling; prefer -phases for new scripts. repair_timing -setup -policy "LEGACY" ``` Public phase tokens: | Token | Policy | Purpose | |---------------------|--------------------------|-------------------------------------------| | `LEGACY` | `SetupLegacyPolicy` | Main legacy-compatible setup repair loop. | | `WNS`, `WNS_PATH` | `SetupWnsPolicy` | Legacy WNS path phase. | | `WNS_CONE` | `SetupWnsPolicy` | Legacy WNS cone phase. | | `TNS` | `SetupTnsPolicy` | Legacy TNS phase. | | `ENDPOINT_FANIN` | `SetupDirectionalPolicy` | Legacy endpoint-fanin phase. | | `STARTPOINT_FANOUT` | `SetupDirectionalPolicy` | Legacy startpoint-fanout phase. | | `LAST_GASP` | `SetupLastGaspPolicy` | Legacy last-gasp repair phase. | | `CRIT_VT_SWAP` | `SetupCritVtSwapPolicy` | Legacy critical VT-swap post phase. | Experimental tokens are accepted but intentionally not listed in the user-facing error message: `LEGACY_MT`, `MT1`, and `MEASURED_VT_SWAP`. `-phases` controls phase/policy ordering. `-sequence` still controls the move ordering inside legacy-style phases. ## Core Data Model The optimizer shares a small set of typed data structures between policies, generators, candidates, and the committer. `MoveType` identifies the move family, while `Target` captures the selected timing object plus any prepared per-target data needed by MT-safe generators. ### Move Type `MoveType` is the single enum for setup-repair move kinds. ```cpp enum class MoveType : uint8_t { kBuffer, kClone, kSizeUp, kSizeUpMatch, kSizeDownFanout, kSwapPins, kVtSwap, kUnbuffer, kSplitLoad, kCount }; ``` ### Target `Target` is the policy-selected object that generators operate on. A target may expose multiple **views**. For example, a path-driver target also exposes an instance view when its driver pin belongs to a standard-cell instance. ```cpp using TargetViewMask = uint8_t; inline constexpr TargetViewMask kPathDriverView = 1u << 0; inline constexpr TargetViewMask kInstanceView = 1u << 1; struct Target { TargetViewMask views{kPathDriverView}; // Output-side pin that identifies the move target. sta::Pin* driver_pin{nullptr}; // Path-driver view fields. const sta::Path* endpoint_path{nullptr}; int path_index{-1}; const sta::Path* driver_path{nullptr}; int fanout{0}; sta::Slack slack{0.0}; const sta::Scene* scene{nullptr}; // Prepared data for MT generation/estimation. std::optional<ArcDelayState> arc_delay; bool canBePathDriver() const; bool canBeInstance() const; bool isPrepared(PrepareCacheMask mask) const; }; ``` | View bit | Meaning | Typical use | |-------------------|-------------------------------|------------------------------------------------------| | `kPathDriverView` | Driver stage on a timing path | Buffer, clone, size, swap pins, unbuffer, split load | | `kInstanceView` | Target instance output pin | Instance-level VT-swap style flows | Currently, `Target` points the target instance or path-driver pin to be optimized. It can be extended to represent a net or a sub-graph in the future. New prepared attributes can also be added to support new move types. ## Policy Model `OptimizationPolicy` is the abstract base for setup-repair strategies. ```cpp class OptimizationPolicy { public: virtual bool start(); virtual void iterate() = 0; protected: void buildMoveGenerators(...); void prepareTargets(std::vector<Target>& targets) const; Target prepareTarget(const Target& target) const; }; ``` Each phase policy receives the same `RepairSetupContext`, `MoveCommitter`, and run configuration. `OptimizationPolicy::start()` returns `false` only when the full optimizer run should stop before any iteration. Otherwise, `iterate()` is called until `converged()` becomes true. ```cpp const std::vector<std::string> phase_names = sta::parseTokens(token_list); const int phase_count = phase_names.size(); RepairSetupContext setup_context(resizer_); for (int i = 0; i < phase_count; ++i) { setup_context.phase_index = i; std::unique_ptr<OptimizationPolicy> policy = makePolicyForPhase(phase_names[i], setup_context); if (!policy->start()) { return false; } while (!policy->converged()) { policy->iterate(); } last_policy = std::move(policy); } return last_policy->finalizeAndReport(setup_context.initial_design_area); ``` Phase selection: | Phase token | Policy | Comment | |---------------------|--------------------------|----------------------------------------------------------------------------------------------| | `LEGACY` | `SetupLegacyPolicy` | Default main setup-repair phase; single-threaded legacy-compatible target and move ordering. | | `WNS`, `WNS_PATH` | `SetupWnsPolicy` | Legacy WNS path phase. | | `WNS_CONE` | `SetupWnsPolicy` | Legacy WNS cone phase. | | `TNS` | `SetupTnsPolicy` | Legacy TNS phase. | | `ENDPOINT_FANIN` | `SetupDirectionalPolicy` | Legacy endpoint-fanin phase. | | `STARTPOINT_FANOUT` | `SetupDirectionalPolicy` | Legacy startpoint-fanout phase. | | `LAST_GASP` | `SetupLastGaspPolicy` | Legacy last-gasp phase. | | `CRIT_VT_SWAP` | `SetupCritVtSwapPolicy` | Legacy critical VT-swap post phase. | | `LEGACY_MT` | `SetupLegacyMtPolicy` | Experimental legacy ordering with MT candidate scoring for selected moves. | | `MT1` | `SetupMt1Policy` | Experimental batched MT policy for `VtSwap` and `SizeUp`. | | `MEASURED_VT_SWAP` | `MeasuredVtSwapPolicy` | Experimental VT-swap policy that measures candidate impact by ECO journal and STA update. | Multiple policies are implemented to show how to implement new policies. > NOTE: New policies except for `LEGACY` are not production quality yet. ### Legacy vs. LegacyMt vs. Mt1 | Policy | Target ordering | Move ordering | MT usage | |-----------------------|----------------------------------------------------------|----------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------| | `SetupLegacyPolicy` | Endpoint-by-endpoint, path-driver targets | Legacy sequence; first accepted move commits | None | | `SetupLegacyMtPolicy` | Same as `SetupLegacyPolicy` | Same as `SetupLegacyPolicy` | Prewarm/prepare support plus parallel candidate scoring for `VtSwap` and `SizeUp`; generation and other move types stay serial | | `SetupMt1Policy` | Batched worst-endpoint path-driver targets per iteration | `VtSwapMt` and `SizeUpMt` only | Target loop is serial; move-type fanout and candidate estimation use the shared thread pool; commit stays serial | ### Stage Pipeline ```mermaid flowchart LR %% style classDef default fill:#ffffff,stroke:#0b1c3c,stroke-width:2px,color:#000; classDef applyNode fill:#eaffea,stroke:#34a853,stroke-width:3px,color:#1b5e20; classDef note fill:#e0f7fa,stroke:#00acc1,stroke-width:2px; %% node N1["<b>1. Collect</b><br/><br/><small>RepairTargetCollector<br>gathers violating<br>targets.</small><br/><br/><b>[ ST ]</b>"] N2["<b>2. Prewarm</b><br/><br/><small>Fill shared<br>Liberty-cell<br>caches once per<br>target vector.</small><br/><br/><b>[ ST ]</b>"] N3["<b>3. Prepare</b><br/><br/><small>Cache target-local<br>ArcDelayState<br>snapshots.</small><br/><br/><b>[ ST ]</b>"] N4["<b>4. Generate</b><br/><br/><small>MoveGenerator<br>generates<br>MoveCandidates.</small><br/><br/><b>[ ST / MT ]</b>"] N5["<b>5. Estimate</b><br/><br/><small>Estimate timing<br>impact and<br>candidate score.</small><br/><br/><b>[ ST / MT ]</b>"] N6["<b>6. Commit</b><br/><br/><small>MoveCommitter<br>finalizes the<br>permanent ECO.</small><br/><br/><b>[ ST ]</b>"] %% Comment box Note["MT policies use<br><b>Prewarm + Prepare</b>"] %% Node connection N1 ==> N2 ==> N3 ==> N4 ==> N5 ==> N6 Note -.-> N2 Note -.-> N3 %% Style class N6 applyNode; class Note note; ``` ## Prewarm Stage The prewarm stage fills shared lazy caches before per-target generation starts. It is intentionally separate from `prepareTargets()` because these caches are owned by `Resizer` / `dbNetwork`, not by individual `Target` objects. | Prewarm data | Used by | Main reason | |--------------------------|-----------------------------------------|----------------------------------------------------------------------------------------------------| | Swappable-cell cache | SizeUp and SizeUpMt candidate selection | Avoid repeated `getSwappableCells()` and VT metadata work. | | VT-equivalent-cell cache | VtSwap and VtSwapMt candidate selection | Avoid repeated `getVTEquivCells()` and VT metadata work. | | Driver-pin cache | MT max-cap checks | Force `dbNetwork::drivers()` lazy cache population on the caller thread before worker-side checks. | The prewarm stage is a pragmatic guard for experimental MT policies. Some APIs look read-only from the caller but can populate internal caches on first use. Prewarming keeps that mutation on the main thread. Future direction: > Prewarm stage can be reduced or removed if STA provides easier warmup (complete all lazy updates) API to ensure thread safety before parallel operations. ## Prepare Stage The prepare stage computes expensive target-local data once before MT-safe generation/estimation. ```cpp // Batch path used by SetupMt1Policy. PrepareCacheMask mask = accumulatePrepareRequirements(); for (Target& target : targets) { prepareTarget(target, mask); } ``` Generators declare per-target data requirements with mask constants: ```cpp PrepareCacheMask prepareRequirements() const override { return kArcDelayStateCache; } ``` Current prepare masks: | Mask | Cached data | Main reason | |-----------------------|---------------------|-----------------------------------------------------------------------------------------| | `kNoPrepareCache` | none | Default for generators that do not read prepared target fields. | | `kArcDelayStateCache` | `Target::arc_delay` | Snapshot timing arc, input slew, load cap, current delay. `DelayEstimator` requires it. | ### Why prepare stage is needed - Some STA state-read APIs include non-trivial computation. - Calling those APIs repeatedly from candidate generation/estimation adds computational overhead. - The prepare stage caches such data for fast worker access in parallel. - Prepare stage can also be used to avoid the use of non-thread-safe APIs by threads if such non-safe APIs exist. For example, retrieving load capacitance via STA API is not cheap as follows: ```text OptimizationPolicy::prepareTargets() or OptimizationPolicy::prepareTarget(const Target&) -> OptimizationPolicy::prepareTarget(target, mask) -> OptimizationPolicy::prepareArcDelayState() -> DelayEstimator::buildContext() -> GraphDelayCalc::loadCap(driver_pin, scene, min_max) // STA API -> for RiseFall::range(): -> GraphDelayCalc::loadCap(driver_pin, rf, scene, min_max) -> GraphDelayCalc::loadCap(..., pin_cap, wire_cap) -> graph_->pinDrvrVertex(driver_pin) -> GraphDelayCalc::multiDrvrNet(driver_vertex) -> GraphDelayCalc::parasiticLoad(...) -> scene->parasitics(min_max) -> GraphDelayCalc::netCaps(...) -> Sdc::connectedCap(...) -> Sdc::netCaps(...) -> network_->visitConnectedPins(driver_pin, FindNetCaps) -> FindNetCaps::operator()(pin) -> Sdc::pinCaps(...) -> Sdc::portCapacitance(...) -> Sdc::pvt(inst, min_max) -> LibertyPort::scenePort(scene, min_max) -> Sdc::operatingConditions(min_max) -> LibertyPort::capacitance(...) -> ArcDelayCalc::findParasitic(driver_pin, rf, scene, min_max) -> Parasitics::capacitance(parasitic) -> ArcDelayCalc::finishDrvrPin() ``` This is a graph/parasitic/SDC traversal, not a trivial field read. Caching it in `Target::arc_delay.load_cap` avoids repeating the same work for every MT candidate. Future direction: > If STA state read APIs become cheaper and clearly thread-safe, this prepare stage will be reduced or removed. ## Delay Estimator And Reporter `DelayEstimator` is a stateless helper split into main-thread context construction and worker-safe candidate scoring. | API | Threading | Purpose | |-----------------------------------------------------|---------------------------|--------------------------------------------------------------------------------| | `DelayEstimator::buildContext()` | Main thread | Read STA/OpenDB state and build `ArcDelayState` for one target. | | `DelayEstimator::estimate(context, candidate_cell)` | Worker-safe after prepare | Read `ArcDelayState` and Liberty tables to estimate one replacement cell. | | `DelayEstimator::estimate(..., trace)` | Diagnostic | Return the same estimate and append one `StageEvaluation` per evaluated stage. | | `DelayEstimator::estimate(SelectedArc, ...)` | Worker-safe | Single-stage table lookup used by simpler candidate paths and tests. | `ArcDelayState` contains the target timing stage plus an optional path window: ```text delay_levels = 0 -> target stage only delay_levels = N -> up to N valid fanin stages + target + up to N valid fanout stages ``` The prepared state includes the selected Liberty arc, input slew, load cap, current model delay/slew, STA graph delay/slew, output-slew merge arcs, and optional STA slew-bias samples. Current estimator approximations: | Item | Handling | |---------------------|---------------------------------------------------------------------------------------------------------------------| | Target cell | Re-evaluated with the candidate Liberty cell. | | Fanin neighbor load | Adjusted by the target input capacitance delta. | | Fanout input slew | Propagated from the estimated upstream output slew. | | Interconnect slew | Preserves the current receiver/driver slew ratio; it does not recalculate full RC waveform degradation. | | Arc matching | Exact match is preferred; the target candidate can use relaxed port/RF matching when needed. | | STA slew bias | `RSZ_MT_SLEW_BIAS > 0` enables three-point load-dependent sampling on the main thread and interpolation in workers. | `DelayEstimatorReporter` is a diagnostic layer, not part of the MT contract. It is used by Tcl command `report_delay_estimator_accuracy` to compare estimator prediction against a measured STA result: ```tcl report_delay_estimator_accuracy \ -inst u1 -lib_cell BUF_X4 -estimator delay_estimator -delay_levels 1 report_delay_estimator_accuracy \ -inst u1 -lib_cell BUF_X4 -estimator legacy ``` Supported estimator names are `legacy`, `delay_estimator`, `legacy_mt`, and `mt`; `legacy_mt` and `mt` are aliases for `delay_estimator`. `-delay_levels` accepts `0`, `1`, or `2` for non-legacy estimators. The reporter runs on the main thread, finds the worst setup target for the instance, builds the requested estimator profile, applies the candidate cell inside an ECO journal, updates timing, records the STA “golden” result, and restores the original design. ## Generator And Candidate Model Each move type is split into two classes. | Role | Class | Responsibility | |-----------|-------------------------------|-------------------------------------------------------------------| | Generator | `MoveGenerator` derived class | Decide applicability and create candidate objects for one target. | | Candidate | `MoveCandidate` derived class | Estimate one concrete ECO proposal and apply it if selected. | `MoveGenerator::isApplicable()` first checks whether the `Target` provides the views required by that generator, then derived classes add move-specific cheap checks. ```cpp virtual bool isApplicable(const Target& target) const { const TargetViewMask views = requiredViews(); return ((views & kPathDriverView) != 0 && target.canBePathDriver()) || ((views & kInstanceView) != 0 && target.canBeInstance()); } protected: virtual TargetViewMask requiredViews() const { return kPathDriverView; } ``` Most generators use the default `kPathDriverView`. `VtSwapGenerator` overrides `requiredViews()` to accept both `kPathDriverView` and `kInstanceView`. Minimal flow: ```cpp if (generator->isApplicable(target)) { CandidateVector candidates = generator->generate(target); for (const std::unique_ptr<MoveCandidate>& candidate : candidates) { Estimate estimate = candidate->estimate(); } } ``` Candidate lifecycle: ```text generate() -> estimate() // No OpenDB mutation; MT policies may run this in workers -> apply() // OpenDB/STA mutation under MoveCommitter ECO journal ``` Current generator/candidate families: | Move type | Generator | Candidate | |----------------|----------------------------------------|----------------------------------------| | Buffer | `BufferGenerator` | `BufferCandidate` | | Clone | `CloneGenerator` | `CloneCandidate` | | SizeUp | `SizeUpGenerator`, `SizeUpMtGenerator` | `SizeUpCandidate`, `SizeUpMtCandidate` | | SizeUpMatch | `SizeUpMatchGenerator` | `SizeUpMatchCandidate` | | SizeDownFanout | `SizeDownFanoutGenerator` | `SizeDownFanoutCandidate` | | SwapPins | `SwapPinsGenerator` | `SwapPinsCandidate` | | VtSwap | `VtSwapGenerator`, `VtSwapMtGenerator` | `VtSwapCandidate`, `VtSwapMtCandidate` | | Unbuffer | `UnbufferGenerator` | `UnbufferCandidate` | | SplitLoad | `SplitLoadGenerator` | `SplitLoadCandidate` | | MeasuredVtSwap | `MeasuredVtSwapGenerator` | `MeasuredVtSwapCandidate` | - Currently, only VtSwap and SizeUp moves have simple multi-threading versions, which should be enhanced further. - MeasuredVtSwap calculates delay impact by using expensive network editing and undo. It is added for test purposes to compare measured VT-swap impact with `DelayEstimator` results. ## Threading Model `utl::ThreadPool` was added as a common utility, not an rsz-local class. ```cpp std::unique_ptr<utl::ThreadPool> OptimizationPolicy::makeWorkerThreadPool() const { const int thread_count = static_cast<int>(resizer_.staState()->threadCount()); const int worker_thread_count = std::max(0, thread_count - 1); return std::make_unique<utl::ThreadPool>(worker_thread_count); } ``` `ThreadPool` exposes both value-returning and void batch APIs: ```cpp thread_pool_->parallelMap(items, [](const Item& item) -> Result { ... }); thread_pool_->parallelFor(items, [](const Item& item) { ... }); ``` When the pool has zero workers, `submit()` executes the task immediately on the caller thread. This keeps policy code uniform while preserving deterministic single-thread behavior (no additional code for single-thread run). Threading rules: | Rule | Reason | |------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------| | Keep the main thread for orchestration and commit | ECO journal, OpenDB mutation, and STA update are serialized. | | Use worker threads for prepared or prewarmed MT work | Candidate generation/estimation should prefer prepared target data; experimental MT paths also rely on explicit prewarm for lazy cache safety. | | Support zero worker threads | `ThreadPool::submit()` runs tasks inline when no workers exist, so callers can still use `parallelMap()` / `parallelFor()` without a separate serial branch. | | Support nested `parallelMap()` / `parallelFor()` | Worker threads waiting on child tasks help drain the same pool, so nested fork-join work does not self-deadlock. | Parallelization currently used by policy implementation: ```text SetupLegacyMtPolicy: one target at a time -> selected candidate scoring for VtSwap/SizeUp in parallel SetupMt1Policy: targets are iterated serially -> move generators for one target run through ThreadPool -> candidate estimates for that target run through ThreadPool ``` ## File Changes | Status | File(s) | Replacement / Purpose | |--------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------| | Removed | `BaseMove.cc`, `BaseMove.hh` | Shared helpers moved into `Resizer`, `MoveCommitter`, `DelayEstimator`, and generator/candidate classes. | | Removed | `RepairSetup.cc`, `RepairSetup.hh` | Replaced by `Optimizer`, `policy/OptimizationPolicy`, `policy/SetupLegacyBase`, `policy/SetupLegacyPolicy`, and derived policies. | | Removed | `BufferMove.cc`, `BufferMove.hh` | Replaced by `move/BufferGenerator.*`, `move/BufferCandidate.*`. | | Removed | `CloneMove.cc`, `CloneMove.hh` | Replaced by `move/CloneGenerator.*`, `move/CloneCandidate.*`. | | Removed | `SizeUpMove.cc`, `SizeUpMove.hh` | Replaced by `move/SizeUpGenerator.*`, `move/SizeUpCandidate.*`, `move/SizeUpMt*`, `move/SizeUpMatch*`. | | Removed | `SizeDownMove.cc`, `SizeDownMove.hh` | Replaced by `move/SizeDownFanoutGenerator.*`, `move/SizeDownFanoutCandidate.*`. | | Removed | `SwapPinsMove.cc`, `SwapPinsMove.hh` | Replaced by `move/SwapPinsGenerator.*`, `move/SwapPinsCandidate.*`. | | Removed | `VTSwapMove.cc`, `VTSwapMove.hh` | Replaced by `move/VtSwapGenerator.*`, `move/VtSwapCandidate.*`, `move/VtSwapMt*`, `move/MeasuredVtSwap*`. | | Removed | `UnbufferMove.cc`, `UnbufferMove.hh` | Replaced by `move/UnbufferGenerator.*`, `move/UnbufferCandidate.*`. | | Removed | `SplitLoadMove.cc`, `SplitLoadMove.hh` | Replaced by `move/SplitLoadGenerator.*`, `move/SplitLoadCandidate.*`. | | Renamed/refactored | `ViolatorCollector.*` -> `RepairTargetCollector.*` | Setup-repair target and violator collection. | | Added | `Optimizer.cc`, `Optimizer.hh` | Top-level repair setup driver and phase sequencing. | | Added | `policy/OptimizationPolicy.cc`, `policy/OptimizationPolicy.hh` | Abstract policy base and shared setup helpers. | | Added | `RepairSetupContext.hh` | Shared per-run setup state passed across phase policies. | | Added | `policy/SetupLegacyBase.cc`, `policy/SetupLegacyBase.hh` | Shared legacy setup-repair implementation used by legacy phase policies. | | Added | `policy/SetupLegacyPolicy.*`, `policy/SetupWnsPolicy.*`, `policy/SetupTnsPolicy.*`, `policy/SetupDirectionalPolicy.*`, `policy/SetupLastGaspPolicy.*`, `policy/SetupCritVtSwapPolicy.*` | Legacy-compatible repair setup phase policies. | | Added | `policy/SetupLegacyMtPolicy.cc`, `policy/SetupLegacyMtPolicy.hh` | Hybrid legacy policy with MT scoring for selected move types. | | Added | `policy/SetupMt1Policy.cc`, `policy/SetupMt1Policy.hh` | Experimental batched MT policy. | | Added | `policy/MeasuredVtSwapPolicy.cc`, `policy/MeasuredVtSwapPolicy.hh` | Experimental measured VT-swap policy. | | Modified | `rsz/Resizer.hh` | Owns the shared `MoveType` enum used by legacy and optimizer code. | | Added | `OptimizerTypes.cc`, `OptimizerTypes.hh` | Shared target, estimate, config, message IDs, move labels, and prepare-stage data structures. | | Added | `DelayEstimator.cc`, `DelayEstimator.hh` | Arc delay state construction and candidate delay estimation helpers. | | Added | `DelayEstimatorReporter.cc`, `DelayEstimatorReporter.hh` | Diagnostic command implementation for comparing estimator predictions with measured STA ECO results. | | Added | `MoveCommitter.cc`, `MoveCommitter.hh` | ECO journal, commit, rollback, accounting, and MoveTracker interface. | | Added | `src/rsz/src/move/MoveGenerator.cc`, `src/rsz/src/move/MoveGenerator.hh` | Base generator interface and shared generator helpers. | | Added | `src/rsz/src/move/*Generator.*` | Move-specific target-to-candidate expansion. | | Added | `src/rsz/src/move/*Candidate.*` | Move-specific estimate/apply implementation. | | Added | `src/utl/include/utl/env.h` | Common environment-variable parsing helpers. | | Added | `src/utl/include/utl/ThreadPool.h`, `src/utl/src/ThreadPool.cpp` | Common nested-safe thread pool used by MT policies. | ## Future Work 1. Architecture a. Apply review feedback b. Consider moving `MoveTracker` out of `MoveCommitter` for detailed tracking 2. UI a. Keep `-phases` as the public spelling b. Document experimental phase tokens only after they become production-ready 3. Enhance setup optimization QoR and runtime a. Enhance VtSwap & SizeUp moves w/ MT b. Develop a score metric for fair comparison among different moves c. Ensure thread safety of APIs d. Better delay estimation e. Better optimization policy 4. Support DRC / hold / power optimization 5. Global optimization (e.g., Lagrangian relaxation) # bug_report.html.md Issues or PRs should be filed with the upstream [parallaxsw/OpenSTA](https://github.com/parallaxsw/OpenSTA). This is effectively a fork (though not strictly for historical reasons). # build.html.md # OpenROAD Build Pitfalls ## Debug vs Release Build Behavior Differences When tests pass locally (Debug) but fail in CI (Release), check for: - **Uninitialized members**: Debug zero-initializes memory; Release leaves garbage - **nullptr through custom hashers**: e.g., `PinIdHash::operator()(nullptr)` segfaults in Release only - **Subnormal float values**: Uninitialized floats may be zero in Debug but subnormal in Release ## Shared Library RPATH vs LD_LIBRARY_PATH External tool binaries (e.g., kepler-formal) have RPATH baked in pointing to the original install location. After rebuilding a dependency, you must either `cmake --install` to the RPATH location or use `LD_PRELOAD`/`patchelf`. Setting `LD_LIBRARY_PATH` alone may be insufficient if RPATH takes precedence. # calibration.html.md # Extraction Rules Generation Flow for OpenRCX This flow generates the RC tech file for OpenRCX. The RC tech file provides resistance and capacitance tables used for RC extraction for a specific process corner. # The flow involves: A. Running OpenRCX `generate_patterns.tcl` to generate layout patterns. - Input: tech LEF - Output: `patterns.def`, `patterns.v` - Script: `generate_patterns.tcl` - Desc: OpenRCX generates many pattern geometries to model various types of capacitance and resistance (i.e., multi-conductor) geometric configurations. B. Running your favorite extraction tool (i.e., reference extractor) to extract parasitics of the layout patterns. - Input: `patterns.def`, `patterns.v` (if required), and additional files required by the reference extractor. - Output: `patterns.spef` - Script: Not provided - Desc: Extract parasitics of the patterns generated by OpenRCX using a reference extractor. This one-time step provides the parasitics of various types of pattern geometries as reference for fitted per-unit length R, C calculation. C. Running OpenRCX to convert `patterns.spef` to RC tech file. - Input: `patterns.spef` - Output: RC tech file - Script: `generate_rules.tcl` - Desc: OpenRCX takes the `.spef` from the reference extractor and performs calculations to produce capacitance and resistance tables for a wide range of wire geometries. The output of this flow is a custom RC tech file for OpenRCX. D. Benchmarking - test the accuracy of OpenRCX on the patterns layout. - Input: `patterns.def` and RC tech file - Output: `rcx.spef`, `diff_spef.out` - Script: `ext_patterns.tcl` - Desc: Perform parasitic extraction on pattern layout for the calibration using the generated RC tech file. OpenRCX then compares the extracted parasitics with the golden parasitics that had been extracted by the reference extractor in Step (B) above. ## How to run: 1. Go to OpenRCX home directory (`./OpenROAD/src/rcx`). 2. Navigate to calibration folder `cd calibration` 3. Modify the `user_env.tcl` script in the script directory. - TECH_LEF: points to the directory of the tech LEF - PROCESS_NODE: the technology node - extRules: the name and the location of the OpenRCX tech file 1. Run the executable script `run.sh` –> run Steps (A) through (D) of the flow above. - `source run.sh` or `./run.sh` 1. The OpenRCX RC tech file can be found in the directory that is specified in the extRules variable. # ci.html.md # CI Workflow ## Pull Requests ### Never Close/Reopen a PR to Retrigger CI Never close a public PR to retrigger CI – `gh pr reopen` requires **admin permissions**. To retrigger CI, use empty commits instead: ```bash git commit --allow-empty -s -m "retrigger CI" ``` ### `gh pr checks` Exit Code 8 Exit code 8 means some checks are still pending – not an error. ### Clang-Tidy CI Clang-Tidy CI can fail not only for code issues but also for **unresolved review comments** on the PR. Review threads cannot be resolved via API on public repos – must be done on the GitHub web UI. ### Running clang-tidy locally via Bazel Run clang-tidy hermetically using the toolchain Bazel already uses to compile: ```bash # Single module: bazel build --config=lint //src/utl/... # Full lint scope (excludes submodules): bazel build --config=lint -- //src/... //third-party/... -//src/sta/... -//third-party/abc/... ``` - Uses `clang-tidy` from `@llvm_toolchain` (the same binary `etc/run-clang-tidy.sh` uses). - Reports land at `$(bazel info bazel-bin)/<pkg>/<target>_rules_lint/<src>.AspectRulesLintClangTidy.out`. - Generated files (SWIG, bison, flex) are auto-skipped. Targets tagged `no-lint` are skipped. - Aspect + config defined in `tools/lint/` and `//:.bazelrc` (`--config=lint`). ## CI Artifacts - Use distinct filenames for public vs private artifacts (never overwrite one with the other) - Files >4GB may need `7z x` or `python3 -m zipfile -e` instead of `unzip` - When possible, download only specific `metadata.json` files instead of the full archive - Do not commit `metadata-base-ok.json` – we have decided not to manage this file. ## Private-to-Staging Sync To sync a private repo PR to the staging (public) repo: 1. Push commits to the **private repo** (`The-OpenROAD-Project-private/OpenROAD`) 2. Add the label **“Ready To Sync Public”** on the **private repo PR** **Important**: The label is **consumed** after each sync (removed by the sync bot). After pushing new commits, you must **re-add** the label. If the label already exists, remove it first, then re-add to trigger the workflow. # coding.html.md # OpenROAD Coding Patterns ## Style Rules ### General C++ Guidelines - Follow the Google C++ Style Guide. - Use modern C++20 style and features. - Apply `const` qualifiers whenever possible. ### Type Declarations - Use C++ casts, not C-style casts ### Braces - Use `{...}` even for single-line statements ### Comments - Do not remove existing comments - Recommend adding a single line comment for each important code block - All comments must be in English ### Function Length - Factor out into multiple functions if a function exceeds 100 lines - Exception: Unit tests can have long functions ### Null Safety - Avoid adding too defensive null checks if the object cannot be null ## Service Interfaces Abstract interfaces published through `utl::ServiceRegistry` use the `Service` suffix (e.g. `est::ParasiticsService`, `drt::PinAccessService`). Each interface lives in its owning module’s public `include/<module>/` directory and is exposed as a small header-only Bazel target that consumers can depend on without pulling in the full implementation library. This keeps module dependency graphs acyclic and the decoupling visible at the build layer. Note that this is distinct from the `Abstract*` prefix used for graphics/visualization mock-swappable classes (e.g. `AbstractSteinerRenderer`); those are inherited for test/headless modes rather than looked up through a registry. ## Common Coding Mistakes ### OpenROAD Message ID Duplicate Checker `etc/find_messages.py` uses regex to match **literal numeric IDs** in `logger->xxx(MODULE, NNNN, ...)` calls. When duplicating a message across modules, use named constants to bypass the checker: ```cpp constexpr int kMsgIdBufferInserted = 1234; logger_->info(RSZ, kMsgIdBufferInserted, "..."); ``` # debugMessages.html.md # MPL2 Debug Messages MPL2 debug messages are divided in: - 5 groups according to HierRTLMP flow stages. - 1 group for a post-process stage responsible for pushing the macros to the boundaries if possible. ## Groups ### Multilevel Autoclustering - Group Name: `multilevel_autoclustering` - Levels: 1. Overall steps of the stage. 2. Include in logs: * Macro signatures; * Connections of candidate clusters to be merged. ### Coarse Shaping - Group Name: `coarse_shaping` - Levels: 1. Overall steps of the stage; 2. Log clusters’ tilings. ### Fine Shaping - Group Name: `fine_shaping` - Levels: 1. Overall steps of the stage; 2. Details of the shapes of each cluster’s children. ### Hierarchical Macro Placement - Group Name: `hierarchical_macro_placement` - Levels: 1. Summary with the final costs of each penalty for cluster/macro placement. 2. Include locations chosen for each child/macro. 3. Include, before the summary, a list with the connections between clusters. ### Orientation Improvement - Group Name: `flipping` - Levels: 1. Print the wire length before and after flipping ### Boundary Push - Group Name: `boundary_push` - Levels: 1. Print name of the macro cluster currently being pushed, its distance to the close boundaries and a message if the move was not possible due to overlap. # debugMessages.html.md # PAR Debug Messages PAR debug messages are divided in the following single-level groups: - 8 groups according general PAR flow; - 2 groups for the top level TritonPart methods. ## General PAR Flow Groups ### Multilevel Partitioning - Group Name: `multilevel_partitioning` - Description: Messages related to the multilevel partitioning methodology function used in TritonPart. ### Coarsening - Group Name: `coarsening` - Description: Messages related to the coarsening step of the TritonPart framework flow. ### Initial Partitioning - Group Name: `initial_partitioning` - Description: Messages related to the initial partitioning step of the TritonPart framework flow. ### Refinement - Group Name: `refinement` - Description: Messages related to the refinement step of the TritonPart framework flow. ### Cut-Overlay Clustering - Group Name: `cut_overlay_clustering` - Description: Although the actual step in TritonPart framework is Cut-Overlay Clustering and Partitioning, these messages are related to the Cut-Overlay Clustering, because general partitioning is done by a class used by other mechanisms (“partitioning” group). ### V-Cycle Refinement - Group Name: `v_cycle_refinement` - Description: Messages related to the V-Cycle Refinement step of the TritonPart framework flow. ### Partitioning - Group Name: `partitioning` - Description: Messages related to the partitioning mechanism used by different functions. ### Evaluation - Group Name: `evaluation` - Description: Messages related to the evaluation mechanism used by different functions. ## Top Level TritonPart Methods ### HyperGraph Partitioning and Evaluation - Group Name: `hypergraph` - Description: Messages related to the main functions triggered by .tcl commands for partitioning and evaluation of a hypergraph. ### Netlist Partitioning and Evaluation - Group Name: `netlist` - Description: Messages related to the main functions triggered by .tcl commands for partitioning and evaluation of a netlist. # debugMessages.html.md # OpenDB Debug Messages ## Groups ### DB editing - Group Name: `DB_EDIT` - Levels: 1. Netlist editing operations (e.g., connect, disconnect, create, …). 2. Other operations. (e.g., create dbGuide, add resistance segment, adjust cap node, field value update, …). ### ECO journal - Group Name: `DB_ECO` - Levels: 1. Certain operations (e.g., create dbCCSeg) 2. Most ECO operations 3. Undo ECO operations + dbGuide creation 4. Undo ECO status change (e.g., start of undo, early exit of undo, …) ### Replace design - Group Name: `replace_design` - Levels: 1. Module/Instance/Port creation and connection operations. 2. Print iterms in a new module during swap master operation. 3. Skipping non-internal nets during replacement. ### Verilog Reader - Group Name: `dbReadVerilog` - Levels: 1. High-level hierarchy creation (Blocks, Modules, Instances, Ports), Properties, Linking, and dumping block content. 2. Detailed netlist creation (Nets, Connections, Child instances). ### Get Default Vias - Group Name: `get_default_vias` - Levels: 1. Default via resolution process (candidates, selection, or missing defaults). # doc_check_tests.html.md # Documentation Check Tests ## Overview OpenROAD has lightweight documentation tests that validate consistency between source code, README files, and man pages. These tests are pure Python and run in seconds without building the OpenROAD binary. ## Running the tests ```shell # All documentation checks (~48 tests, seconds) bazelisk test --test_tag_filters=doc_check //src/... # Duplicate message ID check bazelisk test //:dup_id_test ``` ## What gets tested ### Per-module tests (24 modules) Each module has two documentation tests: - **`{module}_readme_msgs_check`** — Validates that README.md parses correctly into man2 format and messages.txt parses into man3 format. - **`{module}_man_tcl_check`** — Validates that command counts match across help strings, proc definitions, and README documentation. ### Repository-wide tests - **`dup_id_test`** — Checks for duplicate logger message IDs across all source files using `etc/find_messages.py`. ## How it works The tests use the `doc_check_test` Bazel macro defined in `test/regression.bzl`. This is a lightweight variant of `regression_test` that does not depend on `//:openroad`, so no C++ compilation is triggered. All doc check tests are automatically tagged with `doc_check`, which allows tag-based discovery via `--test_tag_filters=doc_check`. Each module’s `messages.txt` is generated on-demand by the `messages_txt` macro (also in `test/regression.bzl`) that runs `etc/find_messages.py` over the module’s source files using the Bazel Python toolchain. ## Relationship to Jenkins Jenkins runs “Documentation Checks” and “Find Duplicated Message IDs” as stages in the PR pipeline. These Bazel tests cover the same checks. Once this is validated in CI, the corresponding Jenkins stages can be removed: - Jenkins “Documentation Checks” stage → `bazelisk test --test_tag_filters=doc_check //src/...` - Jenkins “Find Duplicated Message IDs” stage → `bazelisk test //:dup_id_test` ## Adding a new module When adding documentation tests for a new module: 1. Add `filegroup(name = "doc_files")` and `messages_txt()` macro call to `src/{module}/BUILD` (load `messages_txt` from `//test:regression.bzl`) 2. Add `doc_check_test` entries to `src/{module}/test/BUILD` The `doc_check` tag is automatically added by the macro, so `--test_tag_filters=doc_check` picks up new tests without any changes to the root `BUILD.bazel`. # doxymain.html.md # OpenROAD Doxygen Documentation To navigate the documentation, the most helpful page would be the class index page. There you can find individual classes categorized in alphabetical order. Alternatively, you may also use the search bar on the top-right hand corner to find your desired class efficiently. To go back to OpenROAD documentation, follow this [link](). # insert_buffer.html.md # insert_buffer The `insert_buffer` command is used to manually insert a buffer into the design. It supports three main buffering scenarios: after a driver pin, before a single load pin, and before multiple load pins. It provides two sets of APIs: the high-level `Resizer` APIs and the low-level `dbNet` APIs. Recommend using `Resizer` APIs when the `Resizer` module is available because it provides more features. ## Features - Standard APIs to insert a new buffer: Do not recommend using raw `dbInst::create()` API to insert a new buffer. - Support hierarchical flow: Handles `dbModNet` connections under the hood. - Support legalization: Legalize the buffer position when `Resizer` APIs are used. - Support GUI: Update the GUI when `Resizer` APIs are used. ## Tcl Command Usage ```tcl insert_buffer -buffer_cell lib_cell [-net net] [-load_pins list_of_pins] [-location {x y}] [-buffer_name name] [-net_name name] [-load_pins_on_diff_nets] ``` ### Arguments | Argument | Description | |---------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-buffer_cell` | Specified the library cell to use for the buffer. (Required) | | `-location` | Specifies the `{x y}` coordinates (in microns) where the buffer should be placed. If not specified, the buffer is placed at the driver or load pin location. | | `-buffer_name` | Specifies the base name for the new buffer instance. If not specified, “buf” is used. Note that a unique suffix number will always be added to the base name to avoid a name collision. | | `-net_name` | Specifies the base name for the new net created by the buffer insertion. If not specified, “net” is used. Note that a unique suffix number will always be added to the base name to avoid a name collision. | | `-net` | Specifies the net to be buffered. When used without `-load_pins`, it performs driver-side buffering. | | `-load_pins` | Specifies a single load pin or a list of load pins to buffer together. | | `-load_pins_on_diff_nets` | A flag indicating that the specified `-load_pins` are on the different nets. If specified, multiple load pins on different flat nets can be buffered together and the target net among the multiple flat nets can be selected by `-net`. This option should be used with caution not to change the logical function of the design. | --- ## Buffering Cases ### 1. Driver-side Buffering (`-net`) Inserts a buffer immediately after the driver pin of the specified net. The original net driving all loads is connected to the buffer output, and a new net is created for the buffer input to drive the new buffer instance. **Example:** ```tcl set net [get_nets u_mid1/u_leaf1/n1] insert_buffer -net $net -buffer_cell BUF_X1 -buffer_name buf ``` ### 2. Single Load Buffering (`-load_pins`) Inserts a buffer immediately before the specified load pin. A new net is created for the buffer output to drive only this specific load pin. **Example:** ```tcl set pin [get_pins u_mid1/u_leaf1/buf2/A] insert_buffer -load_pins $pin -buffer_cell BUF_X1 -location {10.0 20.0} ``` ### 3. Multiple Loads Buffering (`-load_pins`) Inserts a buffer that drives a specific subset of loads on a net. A new net is created for the buffer output to drive only the specified load pins. Other loads on the same net remain driven by the original driver. **Example:** ```tcl set loads [get_pins {u_mid1/dff_load1/D u_mid1/dff_load2/D}] insert_buffer -load_pins $loads -buffer_cell BUF_X1 ``` If `-net` is not specified, the command will attempt to infer the net from the first load pin. ### 4. Multiple Loads Buffering with loads on different nets (`-load_pins_on_diff_nets` and optional `-net`) - **Load pins on the same net mode (Default)**: Omit `-load_pins_on_diff_nets`. The command expects all provided pins to be on the same flat net. - **Load pins on different nets mode**: Specify `-load_pins_on_diff_nets` to allow buffering load pins from different `dbNet`s. With `-net` option, the target net on which the buffer is inserted can be selected. If `-net` is not specified, the net connected to the first load pin will be selected as the target net. Note that `-load_pins_on_diff_nets` and `-net` are meaningless when a single load pin is given by `-load_pins`. **Example:** ```tcl # Buffer pins across hierarchical boundaries set loads [get_pins {u_load0/A h0/u_load1/B}] set net [get_net -of_object [get_pins h0/u_load1/B]] insert_buffer -net $net -load_pins $loads -buffer_cell BUF_X1 -load_pins_on_diff_nets ``` --- ## C++ API Documentation There are two levels of C++ APIs for buffer insertion: the high-level `Resizer` API and the low-level `dbNet` API. ### 1. `Resizer` API The `Resizer` API is the recommended way to insert buffers as it handles higher-level tasks such as: - Legalizing the buffer position (using `opendp`). - Updating the design area. - Updating the GUI. - Incrementing the internal `Resizer::inserted_buffer_count_`. - Accepts STA objects (`sta::Net*`, `sta::PinSet`, etc.) which are easier to work with in the resizer context. #### Methods in `Resizer` (rsz/Resizer.hh) ```cpp // STA-based APIs Instance* insertBufferAfterDriver(Net* net, LibertyCell* buffer_cell, const Point* loc = nullptr, const char* new_buf_base_name = "buf", const char* new_net_base_name = "net", const odb::dbNameUniquifyType& uniquify = odb::dbNameUniquifyType::ALWAYS); Instance* insertBufferBeforeLoad(Pin* load_pin, LibertyCell* buffer_cell, const Point* loc = nullptr, const char* new_buf_base_name = "buf", const char* new_net_base_name = "net", const odb::dbNameUniquifyType& uniquify = odb::dbNameUniquifyType::ALWAYS); // PinSeq* overload Instance* insertBufferBeforeLoads(Net* net, PinSeq* loads, LibertyCell* buffer_cell, const Point* loc = nullptr, const char* new_buf_base_name = "buf", const char* new_net_base_name = "net", const odb::dbNameUniquifyType& uniquify = odb::dbNameUniquifyType::ALWAYS, bool loads_on_diff_nets = false); // PinSet* overload Instance* insertBufferBeforeLoads(Net* net, PinSet* loads, LibertyCell* buffer_cell, const Point* loc = nullptr, const char* new_buf_base_name = "buf", const char* new_net_base_name = "net", const odb::dbNameUniquifyType& uniquify = odb::dbNameUniquifyType::ALWAYS, bool loads_on_diff_nets = false); // ODB-based overloads odb::dbInst* insertBufferAfterDriver(odb::dbNet* net, odb::dbMaster* buffer_cell, const Point* loc = nullptr, const char* new_buf_base_name = "buf", const char* new_net_base_name = "net", const odb::dbNameUniquifyType& uniquify = odb::dbNameUniquifyType::ALWAYS); odb::dbInst* insertBufferBeforeLoad(odb::dbObject* load_pin, odb::dbMaster* buffer_cell, const Point* loc = nullptr, const char* new_buf_base_name = "buf", const char* new_net_base_name = "net", const odb::dbNameUniquifyType& uniquify = odb::dbNameUniquifyType::ALWAYS); odb::dbInst* insertBufferBeforeLoads(odb::dbNet* net, const odb::OdbPtrSet<odb::dbObject>& loads, odb::dbMaster* buffer_cell, const Point* loc = nullptr, const char* new_buf_base_name = "buf", const char* new_net_base_name = "net", const odb::dbNameUniquifyType& uniquify = odb::dbNameUniquifyType::ALWAYS, bool loads_on_diff_nets = false); ``` ### 2. `dbNet` API The `dbNet` API provides the core netlist transformation logic. It is a lower-level ODB API and does not perform legalization or GUI updates. #### Methods in `dbNet` (odb/db.h) ```cpp odb::dbInst* insertBufferAfterDriver(odb::dbObject* drvr_output_term, const odb::dbMaster* buffer_master, const odb::Point* loc = nullptr, const char* new_buf_base_name = "buf", const char* new_net_base_name = "net", const odb::dbNameUniquifyType& uniquify = odb::dbNameUniquifyType::ALWAYS); odb::dbInst* insertBufferBeforeLoad(odb::dbObject* load_input_term, const odb::dbMaster* buffer_master, const odb::Point* loc = nullptr, const char* new_buf_base_name = "buf", const char* new_net_base_name = "net", const odb::dbNameUniquifyType& uniquify = odb::dbNameUniquifyType::ALWAYS); // OdbPtrSet overload odb::dbInst* insertBufferBeforeLoads(const odb::OdbPtrSet<odb::dbObject>& load_pins, const odb::dbMaster* buffer_master, const odb::Point* loc = nullptr, const char* new_buf_base_name = "buf", const char* new_net_base_name = "net", const odb::dbNameUniquifyType& uniquify = odb::dbNameUniquifyType::ALWAYS, bool loads_on_diff_nets = false); // std::vector overload odb::dbInst* insertBufferBeforeLoads(const std::vector<odb::dbObject*>& load_pins, const odb::dbMaster* buffer_master, const odb::Point* loc = nullptr, const char* new_buf_base_name = "buf", const char* new_net_base_name = "net", const odb::dbNameUniquifyType& uniquify = odb::dbNameUniquifyType::ALWAYS, bool loads_on_diff_nets = false); ``` --- ## Comparison: `Resizer` vs `dbNet` APIs | Feature | `Resizer` API | `dbNet` API | |------------------|----------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------| | **Object Types** | Uses STA objects (`Net*`, `Pin*`, `LibertyCell*`) | Uses ODB objects (`dbNet*`, `dbObject*`, `dbMaster*`) | | **Legalization** | Automatically legalizes the buffer position. | No legalization. The buffer is placed exactly at `loc`. If `loc` is null, it is placed at the center (centroid) of the driver and load pins. | | **Area Update** | Automatically updates the design area. | Does not update the design area. | | **GUI Support** | Triggers GUI updates to show the new buffer. | No GUI integration. | | **Usage** | Recommended. Best for interactive use and timing optimization flows. | Best for raw database manipulation where Resizer is not available. | ### C++ API Usage Examples #### Using the `Resizer` API (High-level) ```cpp #include "rsz/Resizer.hh" // 1. After Driver rsz::Net* net = network->findNet("u1/n1"); rsz::LibertyCell* buffer_cell = resizer->selectBufferCell(); odb::Point loc(1000, 2000); // optional rsz::Instance* buf = resizer->insertBufferAfterDriver(net, buffer_cell, &loc, "clkbuf", "clknet"); // 2. Before Load rsz::Pin* load_pin = network->findPin("u2/A"); rsz::Instance* buf2 = resizer->insertBufferBeforeLoad(load_pin, buffer_cell); // 3. Before Multiple Loads rsz::PinSet loads(network); loads.insert(network->findPin("u3/A")); loads.insert(network->findPin("u4/A")); rsz::Instance* buf3 = resizer->insertBufferBeforeLoads(nullptr, &loads, buffer_cell); ``` #### Using the `dbNet` API (Low-level) ```cpp #include "odb/db.h" // 1. After Driver odb::dbNet* db_net = block->findNet("n1"); odb::dbObject* drvr = db_net->getFirstDriverTerm(); odb::dbMaster* master = db->findMaster("BUF_X1"); odb::dbInst* buf = db_net->insertBufferAfterDriver(drvr, master, nullptr, "buf1"); // 2. Before Load odb::dbInst* inst = db->findInst("u2"); odb::dbITerm* iterm = inst->findITerm("A"); odb::dbInst* buf = db_net->insertBufferBeforeLoad(iterm, master); // 3. Before Multiple Loads odb::OdbPtrSet<odb::dbObject> loads; loads.insert(iterm1); loads.insert(iterm2); odb::dbInst* buf = db_net->insertBufferBeforeLoads(loads, master); ``` --- ## Precautions - **Legalization**: If you use the `dbNet` API, the buffer is placed at the specified location without checking for overlaps or core boundaries. If the location is not specified (`nullptr`), it is placed at the center (centroid) of the driver and load pins. Use `Resizer::insertBuffer*` if you need the buffer to be legally placed. - **Hierarchical Flow**: The `insert_buffer` command fully supports hierarchical designs. When inserting buffers in a hierarchical context, the API handles the creation of hierarchical ports (`dbModBTerm`) and nets (`dbModNet`) as needed. - **Inferred Nets**: When using `-load_pins` without `-net`, the tool attempts to infer the net from the first load pin. This works if all loads are on the same flat net. - **Uniquify**: The API uses `dbNameUniquifyType::ALWAYS` by default to ensure that newly created instances and nets have unique names across the design hierarchy. ## Future Works 1. Support `-target_hierarchy` option to specify the hierarchy of the new buffer to be inserted. 2. Support the buffer placement on the existing physical route to minimize the routing impact. 3. Support inserting multiple buffers in series. 4. Support inserting inverter pair instead of buffer. # ir.html.md # syn IR The syn intermediate representation is a flat, technology-independent netlist used by OpenROAD’s synthesis submodule. Its design is inspired by [prjunnamed](https://github.com/prjunnamed/prjunnamed)’s IR, translated to C++ and adapted for OpenROAD use case. ## Core Types ### Net A `Net` represents a single-bit signal. Three constants are available: - `Net::zero()` – logic 0 - `Net::one()` – logic 1 - `Net::undef()` – X (undefined) All other Nets are produced as instance outputs by `Graph::add`. One additional out-of-band value exists for transient use. It does not refer to a real instance output: - `Net::sentinel()` – an algorithmic dead/unset/end-of-list marker for pass-internal use. For example, `normalize()` initializes its old-to-new net map to `sentinel()` everywhere and overwrites entries as instances are emitted; the cut-enumeration pass uses `sentinel()` to terminate fixed-size cut arrays; frontends fill a `Bundle` with sentinels initially and replace them as connections are made, any leftover sentinel runs are then swept into explicit `Dangling` instances. ### Bundle A `Bundle` is an owned multi-bit signal bundle. It supports random access (`v[i]` returns the i-th `Net`), `len()`, `empty()`, `slice()`, `concat()`, and extend operations. `Bundle` is always one-dimensional. Factory functions: `Bundle::zero(w)`, `Bundle::ones(w)`, `Bundle::undef(w)`, `Bundle::sentinel(w)`, `Bundle::fromVec(nets)`. The brace-initializer constructor `Bundle{a, b, c}` packs **MSB-first** — `a` is the high bit, `c` is the low bit — opposite to the LSB-first convention of `fromVec`. `Bundle::fromConst(const Const&)` and `toConst()` bridge to the `Const` representation used for constant-folded values. ### BundleView A `BundleView` is a lightweight, non-owning reference to a multi-bit signal. It can represent either a single `Net` or a slice of a `Bundle`. Both `Net` and `const Bundle&` convert to `BundleView` implicitly. Supports `len()`, `operator[]`, and `slice()`. `BundleView` is the return type of operation accessors (see below), allowing callers to read operands uniformly regardless of width. ### ControlNet A `ControlNet` packages a `Net` with a one-bit polarity, used by `Dff` for clock, clear, reset, and enable signals so that active-low controls can be expressed without materializing an explicit inverter in the graph. A positive (active-high) control fires when the net is 1; a negative (active-low) control fires when the net is 0. A `ControlNet` can also be constant: an always-active control (the net is tied so the polarity-adjusted value is permanently 1) or an always-inactive one (permanently 0). `Dff` uses these for unused control inputs — `enable` defaults to always-active and the other controls default to always-inactive. ## Graph The `Graph` class is the top-level netlist container. ### Adding instances ```cpp Graph g; Bundle a = g.add<Input>("a", 8); Bundle b = g.add<Input>("b", 8); Bundle sum = g.add<Adc>(a, b, Net::zero()); g.add<Output>("sum", sum); ``` `add<T>(args...)` allocates the instance, determines its output width, and returns a `Bundle` representing the output bits. ### Resolving nets ```cpp auto [inst, offset] = g.resolve(net); ``` `resolve(Net)` returns a pointer to the owning `Instance` and the bit offset within that instance’s output. This is the primary way to navigate from a net back to the instance that drives it. ### Reading an instance’s outputs ```cpp BundleView outs = g.output(inst); ``` `output(Instance*)` returns a non-owning `BundleView` over the instance’s output bits, so callers can iterate (`for (Net bit : outs)`) or index (`outs[i]`) without copying. It is the natural counterpart to `resolve(net)`. ## Instance Hierarchy All instances derive from `Instance`. `entryType()` identifies the concrete type and `outputWidth()` returns the output width. Three further classification methods drive how passes — most importantly `normalize()` — treat each instance: - `hasEffects()` — true for instances with observable side effects: `Output`, `Other`, `Target` when its cell is a macro, and `Name` when not tentative. These act as roots for liveness and topological emission in `normalize()`. - `hasState()` — true for sequential instances: `Dff`, `Other`, and `Target` when its cell has sequentials. `normalize()` emits them immediately on first encounter and defers DFS of their inputs, so feedback paths do not trigger spurious `LoopBreaker` insertion. - `isSliceable()` — true for the bitwise instances whose output bits can be emitted independently: `Buffer`, `Not`, `And`, `Or`, `Andnot`, `Xor`, `Mux`, `LoopBreaker`, and `Dangling`. `normalize()` exploits this to drop dead bits and their fanin. Concrete types are queried and accessed via templated helpers on `Instance*`: `is<T>()` returns a bool, `try_as<T>()` returns a casted pointer or `nullptr`, and `as<T>()` asserts the type and returns the casted pointer. These match against base classes — `is<Buffer>()` is true for both `BufferFine` and `BufferWide`. ### Tie-offs Always single-bit. No inputs. - `TieHigh` – constant 1 - `TieLow` – constant 0 - `TieX` – constant X (undefined) ### Operations All operations provide accessors returning `BundleView` (or `Net` for single-bit control signals such as `Mux::sel()` and `Adc::cin()`, or `ControlNet` for `Dff`’s clock/clear/reset/enable). | Operation | Accessors | Output width | |-------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------|-------------------| | Buffer | `a()` | input width | | Not | `a()` | input width | | And | `a()`, `b()` | input width | | Or | `a()`, `b()` | input width | | Andnot | `a()`, `b()` | input width | | Xor | `a()`, `b()` | input width | | Mux | `sel()` (Net), `a()`, `b()` | data width | | Adc | `a()`, `b()`, `cin()` (Net) | input width + 1 | | Eq, ULt, SLt | `a()`, `b()` | 1 | | Shl, UShr, SShr, XShr | `a()`, `b()`, stride | first input width | | Mul, UDiv, UMod, SDivTrunc, SDivFloor, SModTrunc, SModFloor | `a()`, `b()` | first input width | | Dff | `data()`, `clock()`, `clear()`, `reset()`, `enable()` (ControlNets, see [ControlNet]()), `initValue()`, `resetValue()`, `clearValue()` | data width | | LoopBreaker | `a()` | input width | #### LoopBreaker `LoopBreaker` is semantically the identity function — its output equals its input — but it carries the meaning “this edge was a combinational back-edge”. Frontends do not emit it directly; `Graph::normalize()` inserts a `LoopBreaker` whenever its topological DFS would otherwise revisit a net already on the stack, severing the cycle at a single, identifiable point. Topological-order checks (`checkNormalization()`) then treat `LoopBreaker` — alongside `Input`, `hasEffects()` instances, and stateful instances — as a place where inputs are allowed to follow outputs in the table. ### Non-operations - `Input` – design input port (name + width). - `Dangling` – a source for intentionally unconnected bits (width). Has no inputs; just produces that many output bits with no driver. Frontends use it to mark signals the source design left floating so they are not silently tied off, and optimization passes treat it as a boundary alongside `Input`. - `Output` – design output port (name + Bundle). - `Name` – named signal. See [Names and tentative names]() below. - `Target` – target-specific instance. - `Other` – generic instance. #### Names and tentative names A `Name` carries the source-level identifier for a signal. It holds the name string, a `Bundle` of value bits, a `[from, to)` bit range (so a name can describe a slice of a wider declared signal), an `is_vector` flag (set when the source declaration was a vector), and a `tentative` flag. Names come in two flavors, distinguished by the `tentative` flag: - **Non-tentative names** are observable: `hasEffects()` returns true, so `normalize()` treats them as roots in both phases. The signal values they reference are preserved exactly: no bits are dropped, no inverters are revived, and the Name is not split. (Net IDs in the value Bundle still go through the standard remap, including buffer forwarding.) - **Tentative names** are best-effort labels (e.g. for debugging or human-readable dumps) that the optimizer is free to drop or rewire. `hasEffects()` returns false, so they are filtered out *before* either phase runs. `Graph::makeNamesTentative()` flips every existing `Name` into this mode in one shot. During `normalize()` tentative names are pulled out of the graph and reattached after the table is rebuilt: - If a referenced bit is dead, `normalize()` walks back through `Buffer` and `Not` instances to find a live source. A pure buffer chain is collapsed to its driver; if the bit is reachable only through an odd number of inversions, a single inverter is revived to keep the polarity correct. - After remap, each tentative name is split on dead bits: every contiguous run of still-live bits becomes one new tentative `Name` instance whose `[from, to)` range is shifted to cover just that surviving slice. --- ## In-Memory Representation ### Net A `Net` is a plain 32-bit index (`uint32_t`). The three constants are backed by actual tie-off instances pre-allocated at indices 0, 1, 2 in the graph’s table. All other indices refer to instance outputs. ### Bundle `Bundle` uses a discriminated union with four representations: 1. **Empty** – zero-width signal. 2. **Single** – one `Net`, stored inline (no allocation). 3. **Consecutive** – a base `Net` plus a width. Bits are at consecutive indices (`base`, `base+1`, …, `base+width-1`). This is the common case for multi-bit instance outputs. 4. **Generic** – a `std::vector<Net>` for arbitrary bit collections (e.g. concatenation of non-adjacent slices). `fromVec` automatically selects the consecutive representation when applicable. ### BundleView `BundleView` stores a `Net` (for the single-bit case), a `const Bundle*` (null for the single-bit case, non-null for the Bundle case), plus `offset_` and `len_` fields for slicing into the referenced Bundle. ### NetTableEntry The base type for all entries in the paged table. Contains a single `uint32_t` header with the entry type packed in the upper 8 bits and the object index (within a page) in the lower 7 bits. ### NetTable A paged object table. Entries are allocated in blocks of 128 slots, where each slot is 16 bytes (`kSlotSize`, defined as `sizeof(PlaceholderEntry)`). Addressing uses `NetTableId` (a `uint32_t`): the upper bits select the block and the lower 7 bits select the slot within the block. Every slot is in one of three states: empty (`kVoid` — e.g. a slot vacated by `removeInstance` or padded in by `padTableTo`), an inline instance, or a `PlaceholderEntry` referencing a heap-allocated instance. Entries never span multiple slots. ### Allocation model Instances are stored in one of two ways: **Inline instances** fit in a single 16-byte slot and have a single-bit output. The slot’s `NetTableId` is the output `Net`. These include: - Tie-offs: `TieHigh`, `TieLow`, `TieX` (8 bytes) - Unary Fine: `BufferFine`, `NotFine` (12 bytes) - Binary Fine: `AndFine`, `OrFine`, `AndnotFine`, `XorFine` (16 bytes) **Heap-allocated instances** are allocated with `operator new` and referenced through `PlaceholderEntry` slots in the table. Each output bit occupies one slot as a `PlaceholderEntry` containing an `Instance*` pointer and a bit offset. These include all Wide types, `MuxFine` and `AdcFine` (24 bytes each, exceeds slot size), comparisons, shifts, arithmetic, `Dff`, `LoopBreaker`, and all non-operation types (`Input`, `Dangling`, `Output`, `Name`, `Target`, `Other`). `Graph::add<T>` chooses the path based on `plan()` (or `sizeof(T)` when no `plan()` exists): if the concrete size is `<= kSlotSize`, construct inline; otherwise heap-allocate. ### PlaceholderEntry A `PlaceholderEntry` stores: - `offset_` (`uint32_t`) – the bit offset within the instance’s output. - `instance_` (`Instance*`) – pointer to the heap-allocated instance. The pointer is placed last in the struct to avoid alignment padding, giving exactly 16 bytes total (4 header + 4 offset + 8 pointer). Heap-allocated instances store a `baseIndex_` field (the `NetTableId` of their first output slot) so they can be relocated when `normalize()` rebuilds the table. ### Output addressing For inline instances, the slot’s `NetTableId` is the output `Net`. For heap-allocated instances, each output bit has a `PlaceholderEntry` slot. `Graph::resolve(Net)` checks the entry type: if it is a placeholder, it returns `{ph.instance(), ph.offset()}`; otherwise the slot holds an inline instance and the offset is 0. ### Normalization `Graph::normalize()` rebuilds the table in topological order, performing per-bit dead code elimination and instance splitting along the way. The result satisfies the invariants checked by `checkNormalization()`: every combinational input is defined before its use, and any combinational cycle is broken by an explicit `LoopBreaker` instance. 1. **Liveness analysis (per-bit dead code elimination).** Roots are instances where `hasEffects()` is true (`Output`, `Other`, `Target` when the cell is a macro, `Name` when not tentative) plus `Input`. Tentative `Name` instances are pulled out of the graph and saved aside. Liveness propagates backward bit-by-bit: for each live net, `Instance::visitSlice(bit_offset, ...)` is called, which on bitwise ops (`Buffer`, `Not`, `And`, `Or`, `Andnot`, `Xor`, `Mux`, `LoopBreaker`) only walks the input bit(s) feeding that output bit. Non-bitwise ops fall back to walking all inputs. 2. **Tentative-name fixup.** For each tentative `Name` whose value bit is dead, walk back through buffers and inverters to find a live source. If found, rewrite the bit (or revive a single inverter and use its output) so the name remains valid. Liveness is re-propagated from any newly-revived nets. 3. **Topological emission.** A fresh `NetTable` is allocated and seeded with the three tie-offs at slots 0/1/2. Effect roots and `Input` instances are emitted first, then a DFS walks their input nets: - `Buffer` / `LoopBreaker` outputs are forwarded: the net map points the output net at the (already-emitted) fanin instead of emitting a copy. - Stateful instances (`Dff`, sequential `Target`, `Other`) are emitted immediately when reached; DFS of their inputs is deferred until all roots have been visited, so feedback paths do not trigger spurious `LoopBreaker` insertion. - Sliceable bitwise instances are emitted bit-by-bit; the emitted slice greedily expands to neighboring output bits whose inputs are already visited. Partially-live wide ops thus become narrower instances via `emitSlice`, dropping dead bits and their fanin. - For all other instances, all inputs are recursively DFS’d before the instance is emitted. - A combinational cycle is broken by inserting a `LoopBreaker` on the back-edge. 4. **Net remap.** The DFS builds a `net_map` (old id → new id). After emission, `baseIndex` on every heap instance is repointed at its new offset-0 slot, and `visitMut(remap)` rewrites every input net reference on every kept instance. 5. **Re-emit tentative Names.** Each saved tentative `Name`’s value bits are remapped through `net_map`. Contiguous runs of still-live bits become a new heap-allocated `Name` with `from`/`to` adjusted to cover the surviving slice; dead bits split the run. 6. **Swap and free.** The new table replaces the old one, heap instances that did not survive are destroyed, and `checkNormalization()` verifies the result. ### Fine/Wide dispatch internals The base class (`Buffer`, `Not`, `And`, etc.) provides two static methods used by `Graph::add`: - `plan(args...)` – returns `sizeof(FineSubclass)` or `sizeof(WideSubclass)` based on input widths. - `construct(mem, args...)` – placement-news the correct subclass into the allocated memory. Types without Fine/Wide variants need neither method. `Graph::add` detects their presence with `requires` and falls back to `sizeof(T)` and direct placement-new. # manREADME.html.md # OpenROAD Documentation This `docs/` hierarchy houses code and raw files to build the on-line documentation (using Sphinx) and manual pages using (using Pandoc) This on-line documentation is available at [https://openroad.readthedocs.io/en/latest/](https://openroad.readthedocs.io/en/latest/). ## Prerequisites - To install pandoc, refer to this [link](https://github.com/jgm/pandoc/blob/main/INSTALL.md). `apt-get` *should* just work for Ubuntu. - To install sphinx requirements, **create a virtual environment (e.g. conda/virtualenv)** and then run `pip install -r requirements.txt`. ### Build instructions for Pandoc manpages The `-j16` command is optional for speeding up the manpage compilation process by using multiple jobs based on the number of cores in your system. ```shell make clean # Note this step is important as it regenerates the documentation using latest sources. make preprocess && make all -j16 ``` #### To view manpages - To run `man` commands inside OpenROAD, you can either use the Linux `man` binary: ```tcl # create a man wrapper source man/scripts/main.tcl man openroad ``` - Or just within OpenROAD itself. ```tcl # you will be prompted to enter the RELATIVE path to cat folders which is optional. man openroad ``` ### Build instructions for Sphinx docs #### HTML docs ```shell make html ``` #### Check for broken links ```shell make checklinks ``` # mbff_hier_fix_notes.html.md # MBFF Hierarchical Clustering — Implementation Notes ## Problem `cluster_flops` (gpl module, `src/gpl/src/mbff.cpp`) clusters single-bit flip-flops into multi-bit tray cells. Before these changes, the clustering pass made several assumptions that held only for flat netlists. Applied to a hierarchical netlist (`link_design -hier`, or any odb with non-trivial `dbModule` structure), it produced any of: 1. Empty `dbModule`s whose original flops had been destroyed without their tray replacements being placed inside. 2. Trays whose `dbModNet`/`dbNet` associations were inconsistent, causing downstream consumers (`estimate_parasitics`, `repair_design`’s buffer insertion, etc.) to crash inside the odb hier traversal or in flute-based Steiner tree construction. 3. Single trays straddling pins from flops that lived in different parent modules — no valid home module for the tray. For a tray cell whose liberty is expressed via a `statetable` (rather than the simpler `ff` block — typical for multi-bit cells with sync or async reset), STA reports the reset port as both an entry in `Sequential::clear()` and `Sequential::data()`. MBFF’s classification predicates didn’t handle this case symmetrically and ended up wiring data pins onto the reset signal. ## Hierarchy view of the bug Before, with `link_design -hier` and a small example design where two leaf modules each host four flops: ```default (top) (top) | | u_mid u_mid / \ / \ leaf_a leaf_b --> cluster_ leaf_a leaf_b <-- empty [4 ff] [4 ff] flops (no inst)(no inst) creates +---------------------+--+ | | v v tray (size 8) in top <-- wrong scope | connectivity: flat dbNet kept, dbModNet dropped ``` After the changes: ```default (top) | u_mid / \ leaf_a leaf_b | | tray tray <-- each tray lives in its leaf's dbModule (sz 4) (sz 4) flat + hier net both preserved ``` ## Root causes | # | Where | What | |-----|----------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | 1 | `MBFF::SeparateFlops` | Cluster partition keyed only by clock-net + `Mask`. Flops with different parent modules could fall into the same bucket. | | 2 | `MBFF::ModifyPinConnections` (tray creation) | `dbInst::create(block, master, name)` placed the new tray on the top `dbBlock`, ignoring the surviving parent `dbModule`. | | 3 | `MBFF::ModifyPinConnections` (pin rewiring) | Captured only `dbNet*` from each original iterm. The companion `dbModNet*` was dropped on `iterm->disconnect()` and never re-bound to the tray iterm. | | 4 | `MBFF::IsDPin` | Used `getLibertyCell()` (which silently substitutes the lib cell with its test cell). Then compared sequential FuncExpr ports against a `lib_port` looked up against the **original** cell. The pointer mismatch caused `seq.clear()->hasPort(lib_port)` to miss, so `IsDPin` returned `true` for ports that are actually reset/preset on statetable cells. | | 5 | `dbITerm::connect(dbNet*)` semantics | Single-arg ODB connect only updates the flat side. When a shared tray pin is re-bound across N original flops, a previously-attached modnet stays — producing inconsistent (`flat`, `mod`) pairs that crash downstream walkers. | ## Implementation All changes live in `src/gpl/src/mbff.cpp`. The header was not touched. ### Fix 1. Partition by `(parent dbModule*, Mask)` `SeparateFlops` now buckets candidate flops by both their parent module and the existing `Mask`. Flops in different modules can never enter the same ILP run, so each cluster has exactly one parent module by construction. ```cpp std::map<std::pair<dbModule*, Mask>, std::vector<Flop>> flops_by_mod_mask; for (const int idx : indices) { const Mask vec_mask = GetArrayMask(insts_[idx], false); flops_by_mod_mask[{insts_[idx]->getModule(), vec_mask}] .push_back(flops_[idx]); } ``` `Mask` itself is unchanged — library-cell tables keyed by `Mask` (`best_master_`, `pin_mappings_`, `slot_to_tray_x_`, …) remain correct. ### Fix 2. Create tray inside the cluster’s parent module Use the `dbInst::create(block, master, name, physical_only, parent_module)` overload (the same idiom as `cts/src/TritonCTS.cpp`) and pass the parent module of any flop in the cluster — by construction of Fix 1, they all share one. ```cpp dbModule* parent = insts_[flops[i].idx]->getModule(); auto new_tray = dbInst::create(block_, best_master_[array_mask][bit_idx], new_name.c_str(), /*physical_only=*/false, parent); ``` ### Fix 3. Preserve `dbModNet` during pin rewiring Capture both `dbNet*` and `dbModNet*` from each original iterm before disconnecting, then rebind the matching tray iterm to both via the dual `dbITerm::connect(dbNet*, dbModNet*)` overload. A free helper `reconnectIterm` (file-local) covers the three real arities so callers don’t have to: ```cpp void reconnectIterm(dbITerm* tray_iterm, dbNet* net, odb::dbModNet* mod_net) { if (net && mod_net) { tray_iterm->connect(net, mod_net); } else if (net) { tray_iterm->disconnectDbModNet(); // see Fix 5 tray_iterm->connect(net); } else if (mod_net) { tray_iterm->connect(mod_net); } } ``` `dbITerm::connect(dbNet*, dbModNet*)` cannot be called with a null modnet — its implementation dereferences the modnet pointer unconditionally — hence the explicit dispatch. The same helper is used for the deferred clock pin rebind at the end of `ModifyPinConnections`. ### Fix 4. IsDPin must scan the right cell’s sequentials `MBFF::IsDPin` previously called `getLibertyCell(cell)`, which substitutes the lib cell with its test cell when one exists. The sequentials it then walked belong to the **test** cell, whose `Sequential::clear()` FuncExpr port set holds **test cell** LibertyPort pointers. The `lib_port` used in the `hasPort()` check, however, came from `network_->libertyPort(pin)` — pointing into the **original** cell. Different pointer ⇒ `hasPort()` returned false ⇒ `IsDPin` answered `true` for ports that are actually reset/preset on statetable cells. Pictorially, before the fix: ```default cell ---getLibertyCell()---> test_cell.sequentials() | v seq.clear()->ports() = { test_cell.RD_port, ... } ^ | hasPort( lib_port from original cell ) -> false ^ | POINTER MISMATCH ``` The fix uses the raw lib cell and scans both the regular and test cell sequentials with the appropriate port lookup. The check is identical to the existing logic in `IsClearPin`/`IsPresetPin`, so all three predicates now share a single helper: ```cpp bool portInSequentialFunc(const sta::LibertyCell* lib_cell, const sta::LibertyPort* lib_port, sta::FuncExpr* (sta::Sequential::*get)() const); ``` - `IsClearPin` := `portInSequentialFunc(.., &Sequential::clear)` - `IsPresetPin` := `portInSequentialFunc(.., &Sequential::preset)` - `IsDPin` := `false` if either of the above is true, then the usual `INPUT && !exclude(clock/supply/scan)` check. ### Fix 5. Defensive modnet clear in `reconnectIterm` Why `disconnectDbModNet()` before single-arg `connect(net)`? Shared tray pins (clear, scan, supply) are reconnected once per original flop in the cluster. When a previous iteration has already attached a modnet to the shared tray pin, a subsequent iteration that passes only a flat net would call the single-arg `connect()` overload — which by ODB design **only** clears the flat side and leaves any prior modnet attached. The result is an inconsistent `(flat, mod)` pair on the tray pin. ```default iter k-1: tray.SE -> connect(net_a, mod_a) flat=net_a, mod=mod_a (OK) iter k: tray.SE -> connect(net_b) (mod_net captured was null) disconnectDbNet() (only flat cleared by ODB) flat=net_b, mod=mod_a (INCONSISTENT) ``` Explicit `disconnectDbModNet()` before the single-arg connect restores the invariant: after any `reconnectIterm()` call the iterm holds a coherent pair. ## Behavior Summary | Scenario | Before fix | After fix | |-----------------------------------------------------------|-------------------------------------------------------------------|-------------------------------------------------------------| | Flat design (`link_design`) | Works | Identical results, no regression | | Hierarchical design, flops all in one submodule | Tray at top, submodule empty | Tray placed in correct submodule | | Hierarchical design, candidate flops span modules | Cross-module tray, submodules empty, modnet corruption | Per-module trays, hierarchy intact | | `link_design -hier`, statetable tray cells (sync/async R) | `estimate_parasitics` / `repair_design` crash in odb hier walkers | Both flat and hier connectivity preserved, downstream clean | Cross-module clustering is no longer attempted. This is a small QoR trade for hierarchy correctness; a future `-flatten_hierarchy` flag could opt back into the old behavior if desired. ## Regression Test `src/gpl/test/mbff_hier.{v,tcl,ok}`, registered in both `CMakeLists.txt` and `BUILD`. The Verilog defines a 3-level hierarchy (`top → mid → leaf`) with two `leaf` instances under one `mid`, four flops per leaf: ```default mbff_hier └── u_mid ├── l0 (leaf) │ ├── ff0..ff3 ├── l1 (leaf) │ ├── ff0..ff3 ``` The driver script `mbff_hier.tcl`: 1. Reads LEF/lib for asap7 single-bit + 2-bit + 4-bit tray cells. 2. `link_design -hier mbff_hier`. 3. Spreads the 8 flops on a 4×2 grid and places them. 4. Creates a clock. 5. Runs `cluster_flops`. 6. Runs `set_wire_rc` + `estimate_parasitics -placement`. 7. Prints `ESTIMATE_PARASITICS_OK`. Expected golden output (`mbff_hier.ok`): ```default ... Sizes used 4-bit: 2 ... ESTIMATE_PARASITICS_OK ``` Two 4-bit trays are formed (one per leaf), and `estimate_parasitics` completes cleanly — both proving that: - Trays are placed inside their respective `leaf` modules (not at the top), and - `dbModNet` topology is consistent enough that the post-cluster Steiner-tree build doesn’t trip the crash signature seen in cva6. Existing flat regression `mbff_orig_name` continues to pass with identical output. ## Files Changed ```default src/gpl/src/mbff.cpp fix (5 changes + 1 shared helper) src/gpl/test/mbff_hier.v regression (new hier design) src/gpl/test/mbff_hier.tcl regression driver src/gpl/test/mbff_hier.ok regression golden src/gpl/test/CMakeLists.txt register mbff_hier src/gpl/test/BUILD register mbff_hier ``` # server-api.html.md # Web Viewer Server API This document describes the wire protocol between the OpenROAD web viewer’s browser frontend and its C++ server. The protocol is intended to be stable enough that an alternate client (custom browser app, headless test driver, third-party visualization) can be implemented against it without reading the JavaScript reference frontend. The server exposes one HTTP route for static assets and one WebSocket endpoint for all dynamic operations. The WebSocket carries a small binary framing with JSON or PNG payloads. ## Connecting - HTTP and WebSocket share one TCP port (default `8080`, configured via `web_server -port`). A single Boost.Beast listener serves both. - HTTP `GET /` returns `index.html`; `GET /<path>` returns the embedded asset at that path (`*.js`, `*.css`, etc.). 404 otherwise. No method other than GET is supported. - The WebSocket upgrade is also at the root path. Once upgraded, all request/response traffic uses the binary framing below. ## Wire frame format Every WebSocket message — both client→server and server→client — is a binary frame with the following layout: | Bytes | Field | Type | Description | |---------|-----------|---------------------|-------------------------------------------------------| | 0…3 | `id` | `uint32` big-endian | Request correlator (see *Correlation*). | | 4 | `type` | `uint8` | Payload type: `0=JSON`, `1=PNG`, `2=Error`. | | 5…7 | reserved | `uint8 × 3` | Must be zero. | | 8… | `payload` | bytes | UTF-8 JSON, PNG-encoded image, or UTF-8 error string. | ### Correlation - The client picks a 32-bit `id` for each request and the server echoes it on the corresponding response. The reference frontend uses a monotonically-increasing counter; any unique value is fine. - Server-push messages (broadcasts that aren’t replies to a specific request) use `id = 0`. ### Payload types - `0 = JSON` — body is a UTF-8 JSON document. Default response shape. - `1 = PNG` — body is a raw PNG file. Used by `tile` and `heatmap_tile`. - `2 = Error` — body is a UTF-8 plain-text error message. Surfaces in the server log as `WEB-0043` (see *Error contract* below). ## Request envelope Every request from the client is a JSON object with at least: | Field | Type | Required | Description | |---------|----------|------------|---------------------------------------------| | `id` | `int` | ✓ | Request id; echoed back unmodified. | | `type` | `string` | ✓ | Selects the handler. See per-type sections. | The rest of the object’s fields are handler-specific. A request with malformed JSON, a non-object root, or missing/wrongly-typed `id` or `type` produces a kError response of the form `Malformed request (missing or invalid id/type)` and a `WEB-0043` warning. A well-formed request whose `type` is not registered produces `Unknown request type: <type>` and the same warning. ## Wire conventions The server is **strict on field types**. Every field below has one canonical JSON type; sending any other type for a present field yields a `kError` response. - Integers travel as JSON numbers parsed as `int64`. - Booleans travel as JSON `true` / `false`. - Doubles are JSON numbers; whole-valued numbers may parse as integers on the wire, which the server tolerates for double-typed fields only. - Strings are JSON strings; arrays are JSON arrays. - Two narrow exceptions documented inline: - `select.zoom` accepts `int` or `double` (Leaflet’s `zoomSnap: 0` permits fractional zoom values). - `set_heatmap.value` for `int`-typed settings accepts `int` or `double` and rounds (the JS frontend always uses `parseFloat`). A “✓” in the **Required** column means the server reads the field unconditionally. Missing fields throw and produce a `kError`. --- ## Server-push messages These arrive with `id = 0` and `type = JSON`. The client subscribes by simply listening on the WebSocket; there’s no opt-in. | `type` field | Trigger | Body | |-----------------|-------------------------------------------------------------------------|-----------------------------------| | `refresh` | Initial spatial-index build finished after a connection / `web_server`. | `{"type":"refresh"}` | | `log` | Buffered server log lines being flushed to clients. | `{"type":"log","text":"<lines>"}` | | `debug_paused` | The graphics-debug pause hook entered (e.g. placer breakpoint). | `{"type":"debug_paused"}` | | `debug_resumed` | Pause hook exited. | `{"type":"debug_resumed"}` | | `debug_refresh` | Debug overlay needs a re-render. | `{"type":"debug_refresh"}` | | `shutdown` | Server is exiting; client should not auto-reconnect. | `{"type":"shutdown"}` | --- ## Tile rendering ### `tile` Render a single 256×256 PNG tile of the layout. | Field | Type | Required | Description | |--------------------|------------|------------------|---------------------------------------------------------------------------------------------------------------------| | `layer` | `string` | ✓ | Layer name (`metal1`, `metal2`, …) or one of the synthetic layers `_instances`, `_modules`, `_pins`, or `_overlay`. | | `z` | `int` | ✓ | Leaflet tile zoom level (0 = whole design). | | `x` | `int` | ✓ | Tile column at zoom `z`. | | `y` | `int` | ✓ | Tile row at zoom `z`. | | `visible_layers` | `string[]` | ✓ | Tech layers currently visible on the *pins* synthetic layer; empty array means hide all pin markers. | | *visibility flags* | `bool` | per-flag default | See *TileVisibility flags* below. Any flag may be omitted to take the default. | | `site_<name>` | `bool` | — | Per-row-site visibility. Only consulted when `rows == true`. | **Response:** PNG image (frame type `1`). ### `bounds` Return the design’s bounding box and shape-cache readiness. No request fields beyond the envelope. **Response (JSON):** ```json { "bounds": [[yMin, xMin], [yMax, xMax]], "shapes_ready": true, "pin_max_size": 200 } ``` `bounds` is in DBU. `shapes_ready` indicates whether the spatial index finished building (the `refresh` push fires when this flips to true). `pin_max_size` is the largest BPin dimension in DBU, used by the client to size the pin-marker overlay. ### `tech` Return tech-layer metadata, sites, and block info. No request fields. **Response (JSON):** ```json { "layers": ["metal1", "via1", "metal2", "..."], "layer_colors": [[r, g, b], ...], "sites": ["FreePDK45_38x28_10R_NP_162NW_34O", "..."], "has_liberty": true, "dbu_per_micron": 1000, "block_name": "top" } ``` `layer_colors` is parallel to `layers`; each entry is RGB in `0..255`. `block_name` is the empty string when no block is loaded. --- ## Selection and inspection ### `select` Pick the topmost selectable object at a DBU coordinate. Cycles through overlapping objects on repeated calls at the same point. | Field | Type | Required | Description | |--------------------|-------------------|------------------|-----------------------------------------------------------------| | `dbu_x` | `int` | ✓ | X coordinate in DBU. | | `dbu_y` | `int` | ✓ | Y coordinate in DBU. | | `zoom` | `int` or `double` | ✓ | Current Leaflet zoom level. Server truncates fractional values. | | `visible_layers` | `string[]` | ✓ | Same semantics as `tile`. | | *visibility flags* | `bool` | per-flag default | Same as `tile`. | | `site_<name>` | `bool` | — | Same as `tile`. | **Response (JSON):** the inspect payload (see `inspect` below) plus a top-level `selected` array listing every overlapping candidate: ```json { "selected": [ {"name": "buf1", "type": "Inst", "bbox": [xMin, yMin, xMax, yMax]}, ... ], "can_navigate_back": 0, "name": "buf1", "type": "Inst", "properties": [...], "bbox": [xMin, yMin, xMax, yMax] } ``` When no object is selectable at the point, `selected` is `[]` and only `can_navigate_back` is set (no `name`/`type`/`properties`). ### `inspect` Re-inspect a previously-selected object using its session-local id from a prior `select`. | Field | Type | Required | Description | |-------------|--------|------------|---------------------------------------------------------| | `select_id` | `int` | ✓ | ID returned in a previous `select` `*_select_id` field. | **Response (JSON):** same shape as the inspect portion of `select`’s response, *without* the `selected` array: ```json { "can_navigate_back": 1, "name": "buf1/Z", "type": "ITerm", "properties": [ {"name": "Master", "value": "BUF_X16", "value_select_id": 12}, {"name": "Children", "children": [ {"name": "child", "value": "...", "value_select_id": 13}, ... ]} ], "bbox": [xMin, yMin, xMax, yMax], "has_guides": 1 } ``` `*_select_id` fields appear next to any property whose value is itself selectable; the client passes them back via `inspect` to drill down. `has_guides` is present (and `1`) only when the inspected object is a net with route guides. `can_navigate_back` is `1` whenever the back-navigation history is non-empty. If `select_id` is out of range, the response includes `{"error": "invalid select_id"}` instead of the metadata. ### `inspect_back` Pop the back-navigation stack and re-emit the inspect payload for the previous object. No request fields. **Response (JSON):** same shape as `inspect` but for the previous object. ### `hover` Highlight an object’s shapes (mouseover preview) without selecting it. | Field | Type | Required | Description | |-------------|--------|------------|-------------------------------------------------------| | `select_id` | `int` | ✓ | Selectable id; pass `-1` to clear hover (mouseleave). | **Response (JSON):** ```json {"ok": 1, "count": 3, "rects": [[xMin, yMin, xMax, yMax], ...]} ``` `count` is the number of highlight rects collected; an empty rect array falls back to the object bbox. ### `snap` Find the nearest design edge to a cursor position (for the ruler / crosshair tool). | Field | Type | Required | Description | |--------------------|------------|------------------|--------------------------------------------------------------------------------------------| | `dbu_x` | `int` | ✓ | Cursor X in DBU. | | `dbu_y` | `int` | ✓ | Cursor Y in DBU. | | `radius` | `int` | ✓ | Search radius in DBU. | | `point_threshold` | `int` | ✓ | If two snap candidates fall within this many DBU of each other, prefer the point endpoint. | | `horizontal` | `bool` | ✓ | Allow snapping to horizontal edges. | | `vertical` | `bool` | ✓ | Allow snapping to vertical edges. | | `visible_layers` | `string[]` | ✓ | Layers to consider for routing snaps. | | *visibility flags* | `bool` | per-flag default | Same as `tile`. | **Response (JSON):** ```json { "found": true, "is_point": false, "edge": [[x1, y1], [x2, y2]] } ``` `is_point` is `true` when the snap collapsed to a point (e.g. corner). On `"found": false`, `edge` and `is_point` are absent. --- ## Schematic ### `schematic_cone` Build a cone of influence around an instance (fanin/fanout) and return it as a Yosys-format netlist for the netlistsvg renderer. | Field | Type | Required | Description | |----------------|----------|------------|--------------------------------------| | `inst_name` | `string` | ✓ | Anchor instance name. | | `fanin_depth` | `int` | ✓ | BFS depth upstream (`0` = no fanin). | | `fanout_depth` | `int` | ✓ | BFS depth downstream. | **Response (JSON):** a Yosys netlist JSON ([schema](https://yosyshq.readthedocs.io/projects/yosys/en/latest/cmd/write_json.html)) limited to one module named `top`: ```json { "modules": { "top": { "attributes": {}, "ports": {"<bterm name>": {"direction": "input", "bits": [n]}}, "cells": {"<inst name>": {"hide_name": 0, "type": "<master>", "attributes": {}, "parameters": {}, "port_directions": {...}, "connections": {...}}}, "netnames": {"<net name>": {"hide_name": 0, "bits": [n], "attributes": {}}} } } } ``` Cones are capped at 150 instances; nets with fanout > 30 are skipped to keep the schematic readable. ### `schematic_full` Same shape as `schematic_cone` but emits the entire block (no caps). No request fields. ### `schematic_inspect` Inspect a single instance by name (used when the schematic widget selects a cell). Equivalent to a `select`+`inspect` pair but skips the geometric pick. | Field | Type | Required | Description | |-------------|----------|------------|---------------------------| | `inst_name` | `string` | ✓ | Instance name to inspect. | **Response (JSON):** same shape as `inspect`. --- ## Tcl ### `tcl_eval` Evaluate a Tcl command. Captures `info` log output and the command’s result. | Field | Type | Required | Description | |---------|----------|------------|------------------------| | `cmd` | `string` | ✓ | The Tcl source string. | **Response (JSON):** ```json { "output": "captured stdout/log lines", "result": "Tcl_GetStringResult(interp)", "is_error": false } ``` When the user runs `exit` or `quit` from the browser, the server’s override turns the result into a shutdown signal: ```json { "output": "...", "result": "Exiting OpenROAD.", "is_error": false, "action": "shutdown" } ``` Clients that see `action: "shutdown"` should disable auto-reconnect. ### `tcl_complete` Tab-completion for the Tcl prompt. Splits the line at the cursor and reports candidate completions plus the replacement range. | Field | Type | Required | Description | |--------------|----------|------------|--------------------------------------| | `line` | `string` | ✓ | Full input line. | | `cursor_pos` | `int` | ✓ | Cursor offset into `line` (0-based). | **Response (JSON):** ```json { "completions": ["...", "..."], "mode": "commands" | "variables" | "arguments", "prefix": "the matched prefix", "replace_start": 4, "replace_end": 8 } ``` --- ## Timing and charts ### `timing_report` Return the worst N timing paths. | Field | Type | Required | Default | Description | |-------------|----------|------------|------------|-------------------------------------------------| | `is_setup` | `bool` | ✓ | — | `true` → setup paths, `false` → hold. | | `max_paths` | `int` | ✓ | — | Maximum number of paths to return. | | `slack_min` | `double` | | `-FLT_MAX` | Lower slack bound (inclusive). Optional filter. | | `slack_max` | `double` | | `+FLT_MAX` | Upper slack bound (exclusive). Optional filter. | **Response (JSON):** ```json { "paths": [ { "start_clk": "clk", "end_clk": "clk", "required": 1.0, "arrival": 1.5, "slack": -0.5, "skew": 0.0, "path_delay": 0.9, "logic_depth": 4, "fanout": 12, "start_pin": "ff1/CK", "end_pin": "ff2/D", "data_nodes": [{"pin": "...", "fanout": 1, "rise": true, "clk": false, "time": 0.0, "delay": 0.0, "slew": 0.0, "load": 0.0}, ...], "capture_nodes": [{...}] }, ... ] } ``` ### `timing_highlight` Highlight one timing path’s shapes on the layout, optionally with a single stage emphasized. | Field | Type | Required when | Description | |--------------|----------|-----------------------|----------------------------------------------------------------| | `path_index` | `int` | always | Index into the most recent `timing_report.paths`. `-1` clears. | | `is_setup` | `bool` | `path_index >= 0` | Which side of the report `path_index` indexes into. | | `pin_name` | `string` | optional, `>= 0` only | If set, emphasize this pin’s net within the path. | **Response (JSON):** `{"ok": true}`. The actual update is the layer overlay redraw on the next `tile` request. ### `slack_histogram` Histogram of endpoint slacks for one side of the timing report. | Field | Type | Required | Description | |--------------|----------|------------|----------------------------------------------------------| | `is_setup` | `bool` | ✓ | Setup vs hold endpoints. | | `path_group` | `string` | | If non-empty, restrict to this path group. Default: all. | | `clock_name` | `string` | | If non-empty, restrict to this clock. Default: all. | **Response (JSON):** ```json { "bins": [{"lower": -1.0, "upper": 0.0, "count": 12, "negative": true}, ...], "unconstrained_count": 5, "total_endpoints": 1234, "time_unit": "ns" } ``` ### `chart_filters` List the path groups and clocks available for the slack histogram filter dropdowns. No request fields. **Response (JSON):** ```json {"path_groups": ["**default**", ...], "clocks": ["clk1", "clk2", ...]} ``` ### `clock_tree` Compute the clock tree (CTS view). No request fields. **Response (JSON):** ```json { "clocks": [ { "name": "clk", "min_arrival": 0.0, "max_arrival": 0.5, "time_unit": "ns", "nodes": [ {"id": 0, "parent_id": -1, "name": "...", "pin_name": "...", "type": "root" | "buffer" | "inverter" | "clock_gate" | "register" | "macro" | "unknown", "arrival": 0.0, "delay": 0.0, "fanout": 0, "level": 0, "dbu_x": 0, "dbu_y": 0}, ... ] } ] } ``` ### `clock_tree_highlight` Highlight a single clock-tree node’s instance in the layout. | Field | Type | Required | Description | |-------------|----------|------------|------------------------------------| | `inst_name` | `string` | ✓ | Empty string clears the highlight. | **Response (JSON):** `{"ok": true}`. --- ## Module hierarchy ### `module_hierarchy` Return the module hierarchy tree (left sidebar). No request fields. **Response (JSON):** ```json { "nodes": [ { "id": 0, "parent_id": -1, "inst_name": "<top>", "module_name": "...", "insts": 1234, "macros": 0, "modules": 5, "area": 1.23, "local_insts": 100, "local_macros": 0, "local_modules": 5, "node_kind": 1, // present when not kModule (kLeafGroup=1, kTypeGroup=2, kInstance=3) "odb_id": 42, // present only on kModule nodes "color": [r, g, b] // present only on kModule nodes }, ... ] } ``` ### `set_module_colors` Update the per-module color override map (for the `_modules` tile layer). | Field | Type | Required | Description | |----------|----------|------------|--------------------------------------------------------------------------------------------| | `colors` | `string` | ✓ | Custom delimited form: `<id>:<r>,<g>,<b>,<a>;<id>:<r>,<g>,<b>,<a>;...`. Empty = clear all. | **Response (JSON):** `{"ok": 1, "count": <updated module count>}`. ### `set_focus_nets` Add or remove a net from the focus-nets set (route-tracing overlay). | Field | Type | Required | Description | |------------|----------|------------|--------------------------------------------------------------------------------------------------------| | `action` | `string` | ✓ | `"add"`, `"remove"`, or `"clear"`. | | `net_name` | `string` | ✓ | Net name for `add`/`remove`. Pass `""` for `clear`; the value is unused but the field must be present. | **Response (JSON):** `{"ok": 1, "count": <focus-net count>}`. ### `set_route_guides` Same shape as `set_focus_nets` but updates the route-guides overlay. --- ## Heat maps ### `heatmaps` Return metadata for every registered heat map. No request fields. **Response (JSON):** ```json { "active": "Pin", // empty when none active "heatmaps": [ { "name": "Pin", "title": "Pin Density", "active": true, "settings_group": "Density", "has_data": true, "can_adjust_grid": true, "show_numbers": false, "show_legend": true, "supports_numbers": true, "units": "/um²", "display_range_increment": 1.0, "display_min": 0.0, "display_max": 100.0, "display_min_limit": 0.0, "display_max_limit": 100.0, "draw_below_min": true, "draw_above_max": true, "log_scale": false, "reverse_log": false, "grid_x": 10.0, "grid_y": 10.0, "grid_min": 1.0, "grid_max": 1000.0, "alpha": 150, "alpha_min": 0, "alpha_max": 255, "bounds": [xMin, yMin, xMax, yMax], "options": [...], // source-specific extra settings "legend": [{"value": "5.0", "color": [r, g, b, a]}, ...] }, ... ] } ``` ### `set_active_heatmap` Activate a heat map (or none). | Field | Type | Required | Description | |---------|----------|------------|---------------------------------------| | `name` | `string` | ✓ | Empty string deactivates the current. | **Response (JSON):** same shape as `heatmaps`. ### `set_heatmap` Update one setting on one heat map. | Field | Type | Required | Description | |----------|--------------------------------------|------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------| | `name` | `string` | ✓ | Heat-map name (e.g. `"Pin"`). | | `option` | `string` | ✓ | Setting key (e.g. `"DisplayMin"`, `"Alpha"`, `"ShowNumbers"`); also `"rebuild"` to force a re-population. | | `value` | `bool`, `int`, `double`, or `string` | ✓ when `option != "rebuild"` | Type must match the setting’s variant slot, with one tolerance: int-typed settings accept JSON doubles and round (the JS frontend always uses `parseFloat`). | **Response (JSON):** same shape as `heatmaps`. ### `heatmap_tile` Render one tile for the active heat map (or a specified one). | Field | Type | Required | Description | |---------|----------|------------|--------------------------------------------------------| | `name` | `string` | ✓ | Heat-map name; empty string ⇒ use the active heat map. | | `z` | `int` | ✓ | Tile zoom. | | `x` | `int` | ✓ | Tile column. | | `y` | `int` | ✓ | Tile row. | **Response:** PNG (frame type `1`). --- ## DRC ### `drc_categories` List top-level DRC categories. No request fields. **Response (JSON):** ```json { "categories": [ {"name": "DRC", "count": 42, "description": "...", "source": "..."}, ... ] } ``` `description` and `source` are present only when the category provides them. ### `drc_markers` Drill into one DRC category and return its subcategories + markers. | Field | Type | Required | Description | |------------|----------|------------|------------------------------------------------------------------------------------------------------| | `category` | `string` | ✓ | Top-level category name. Empty string clears the active category and returns `{"subcategories":[]}`. | **Response (JSON):** ```json { "name": "DRC", "total_count": 42, "subcategories": [ { "name": "Subcat", "count": 3, "subcategories": [...], "markers": [ { "id": 1, "index": 1, "name": "...", "visited": false, "visible": true, "waived": false, "bbox": [xMin, yMin, xMax, yMax], "layer": "metal1", // optional "comment": "rule X", // optional "sources": [{"type": "Net" | "Inst" | "ITerm" | "BTerm" | "Object", "name": "..."}, ...] }, ... ] }, ... ] } ``` When the named category isn’t found, the response is `{"error": "Category not found: <name>"}`. ### `drc_load_report` Load DRC markers from a `.rpt`, `.drc`, or `.json` file on disk. | Field | Type | Required | Description | |---------|----------|------------|--------------------------------------------------------------| | `path` | `string` | ✓ | Server-side filesystem path. Format inferred from extension. | **Response (JSON):** `{"ok": 1, "category": "DRC", "count": 42}` on success or `{"ok": 0, "error": "..."}` on no-violations / failure. ### `drc_update_marker` Toggle one marker’s `visited` or `visible` flag. | Field | Type | Required | Description | |-------------|----------|------------|----------------------------------------------| | `marker_id` | `int` | ✓ | Marker id from `drc_markers` `markers[].id`. | | `field` | `string` | ✓ | `"visited"` or `"visible"`. | | `value` | `bool` | ✓ | New value. | **Response (JSON):** `{"ok": 1, "id": <id>, "field": <field>, "value": <bool>}`. ### `drc_update_category_visibility` Bulk-set every marker in a category to a single `visible` value. | Field | Type | Required | Description | |------------|----------|------------|-----------------| | `category` | `string` | ✓ | Top-level name. | | `visible` | `bool` | ✓ | New visibility. | **Response (JSON):** `{"ok": 1, "category": "...", "visible": <bool>, "count": <updated>}`. ### `drc_highlight` Center the layout viewport on a marker and set the highlight rect. | Field | Type | Required | Description | |-------------|--------|------------|----------------------------------------------| | `marker_id` | `int` | ✓ | Marker id; pass `-1` to clear the highlight. | **Response (JSON):** on hit: ```json {"ok": 1, "bbox": [xMin, yMin, xMax, yMax], "name": "...", "visited": true, "layer": "metal1"} ``` `layer` is omitted when the marker has no tech layer. On miss (or explicit clear with `-1`): `{"ok": 0}`. --- ## Files ### `list_dir` Server-side directory listing (used by the file-open dialog). | Field | Type | Required | Description | |---------|----------|------------|------------------------------------------------------------------------| | `path` | `string` | ✓ | Absolute path. Empty string ⇒ current working directory of the server. | **Response (JSON):** ```json { "path": "/canonical/absolute", "parent": "/canonical", "entries": [ {"name": "subdir", "is_dir": true}, {"name": "report.rpt","is_dir": false, "size": 12345}, ... ] } ``` Hidden entries (`.`-prefixed) and unreadable entries are skipped. Directories are listed before files; both groups sort alphabetically. --- ## Debug graphics ### `debug_continue` Resume execution after a debug-pause hook (`gui::Gui::pause()` etc.). Inline-dispatched (does not enter the worker thread pool). No request fields. **Response (JSON):** `{"ok":1}`. ### `debug_charts` Snapshot the registered debug charts. Inline-dispatched. No request fields. **Response (JSON):** ```json { "charts": [ { "name": "...", "x_label": "iteration", "y_labels": ["loss", "violations"], "x_format": "{}", "y_formats": ["{:.2e}", "{}"], "points": [{"x": 0, "ys": [0.5, 12]}, ...] }, ... ] } ``` --- ## TileVisibility flags These flags appear together (typically prefixed with `vf` in the JS client) on every request that takes a viewport: `tile`, `select`, and `snap`. All are `bool`. Each handler defaults a missing flag to its struct default — the column below — but the JS reference frontend always sends the full set. | Field | Default | Notes | |-----------------------------------------------------------------------------------------------------------------------------------|-----------|--------------------------------------------------------------| | `stdcells`, `macros` | `true` | Instance categories (Liberty-aware when STA is loaded). | | `pad_input`, `pad_output`, `pad_inout`, `pad_power`, `pad_spacer`, `pad_areaio`, `pad_other` | `true` | Pad sub-types. | | `phys_fill`, `phys_endcap`, `phys_welltap`, `phys_tie`, `phys_antenna`, `phys_cover`, `phys_bump`, `phys_other` | `true` | Physical-only cell sub-types. | | `std_bufinv`, `std_bufinv_timing`, `std_clock_bufinv`, `std_clock_gate`, `std_level_shift`, `std_sequential`, `std_combinational` | `true` | Std-cell sub-types (need Liberty/STA). | | `net_signal`, `net_power`, `net_ground`, `net_clock`, `net_reset`, `net_tieoff`, `net_scan`, `net_analog` | `true` | By `dbSigType`. | | `routing`, `routing_segments`, `routing_vias`, `special_nets`, `srouting_segments`, `srouting_vias` | `true` | Wires & vias. | | `pins`, `pin_markers`, `pin_names` | `true` | BTerm shapes & labels. | | `inst_names`, `inst_pins`, `inst_pin_names` | `true` | ITerm shapes & labels. | | `blockages`, `placement_blockages`, `routing_obstructions` | `true` | dbBlockage / dbObstruction. | | `rows` | `false` | Enables the row-outline overlay; gates `site_<name>` lookup. | | `tracks_pref`, `tracks_non_pref` | `false` | Routing-track overlay. | | `debug`, `debug_renderers`, `debug_live` | `false` | Debug graphics overlay. | | `site_<name>` (multi-key) | `false` | Per-row-site visibility. Only consulted when `rows == true`. | --- ## Error contract The server treats wire-protocol violations as recoverable: the offending request gets a `kError` response, the rest of the session continues. - **Malformed message** (invalid JSON, non-object root, missing/wrong-typed `id` or `type`): `kError` body `Malformed request (missing or invalid id/type)`. - **Unknown type**: `kError` body `Unknown request type: <type>`. - **Handler exception** (boost::json `at()` on a missing field, type conversion failure, internal `runtime_error`, …): `kError` body `server error: <exception what()>`. Every `kError` response logs a server-side warning: ```default [WARNING WEB-0043] request id=<id> type=<type> failed: <body> ``` `type` is the original `type` string from the request when it was parseable, otherwise `unknown`. The full request payload is *not* logged; clients should reproduce locally if a payload is needed for diagnosis. The reference JS client surfaces `kError` responses as a Promise rejection through `WebSocketManager.request(...)`. Custom clients should handle frame type `2` similarly. # testing.html.md # OpenROAD Testing Guide OpenROAD has two types of tests: **integration tests** (Tcl) and **unit tests** (C++). ## CAUTION – Dual Registration Required **Every new test MUST be registered in BOTH build systems. Missing either one is a build break.** | Build System | Registration File | Block/Macro | |----------------|------------------------------------|-----------------------------| | **CMake** | `src/<module>/test/CMakeLists.txt` | `or_integration_tests(...)` | | **Bazel** | `src/<module>/test/BUILD` | `regression_test(...)` | Forgetting the Bazel `BUILD` file is the most common mistake – CMake-only registration silently passes local `make test` but the **test will be missing from Bazel CI**. ## Integration Tests Integration tests are Tcl scripts located at `src/<module>/test` or `src/<module>/test/tcl`. ### Running Integration Tests `./regression` is a ctest wrapper that filters by module label. ```bash cd src/rsz/test ./regression -R buffer_ports1 # run one test (regex match) ./regression -R "repair.*hier" # run tests matching pattern ./regression -j4 -V # all rsz tests, parallel, verbose # Or equivalently from the build directory: cd build ctest -R "rsz\.buffer_ports1\.tcl" ``` ### Creating a New Integration Test Best practice reference: `src/rsz/test/repair_tie12_hier.tcl` #### Issue Reproduction Tests For issue reproductions, keep the test case minimal and focused on the failing tool behavior. When floorplanning or placement is not part of the bug, encode the small problem design directly in DEF and use `read_def` after loading the necessary LEF and Liberty files instead of running floorplanning or global placement. This keeps the test simpler and more stable across unrelated OpenROAD behavior changes. Use floorplanning or placement steps when those stages are part of the behavior under test. #### Checklist 1. **Header comment**: First line must explain the test purpose ```tcl # [Brief description of the test] ``` 2. **Set test name**: Used for output file generation ```tcl set test_name <integration_test_name> ``` 3. **Output naming with `make_result_file`**: Use for temporary output files ```tcl set verilog_filename "${test_name}.v" set out_verilog [make_result_file $verilog_filename] write_verilog $out_verilog ``` 4. **Verification with `diff_file`**: Compare against golden files ```tcl diff_file ${test_name}.vok $out_verilog ``` 5. **Generate `<test_name>.ok` file**: Create golden test log by executing the script, redirecting stdout, and removing the openroad banner at the top. 6. **Registration (BOTH files for CMake and Bazel – do NOT skip Bazel)** ### Test Framework Flags - `-no_splash -no_init -exit` ### Golden File Notes - `.ok` = log golden file (full stdout), `.vok` = verilog golden file - **`diff_file` reports only the first difference** – when regenerating golden files, regenerate the entire output file rather than relying on incremental diffs. ## Unit Tests Unit tests are C++ files located at `src/<module>/test/cpp`. ### Test Registration - CMake: `src/<module>/test/CMakeLists.txt` - Bazel: `src/<module>/test/BUILD` or `src/<module>/test/cpp/BUILD` # translator.html.md # Global Placement The global placement module in OpenROAD (`gpl`) is based on the open-source RePlAce tool, from the paper “Advancing Solution Quality and Routability Validation in Global Placement”. Features: - Analytic and nonlinear placement algorithm. Solves electrostatic force equations using Nesterov’s method. ([link](https://cseweb.ucsd.edu/~jlu/papers/eplace-todaes14/paper.pdf)) - Verified with various commercial technologies and research enablements using OpenDB (7/14/16/28/45/55/65nm). - Verified deterministic solution generation with various compilers and OS. - Supports Mixed-size placement mode. ## Commands #### NOTE - Parameters in square brackets `[-param param]` are optional. - Parameters without square brackets `-param2 param2` are required. ### Global Placement When using the `-timing_driven` flag, `gpl` does a virtual `repair_design` to find slacks and weight nets with low slack. It adjusts the worst slacks (modified with `-timing_driven_nets_percentage`) using a multiplier (modified with `-timing_driven_net_weight_max`). The multiplier is scaled from the full value for the worst slack, to 1.0 at the `timing_driven_nets_percentage` point. Use the `set_wire_rc` command to set resistance and capacitance of estimated wires used for timing. Routability-driven arguments - They begin with `-routability`. - `-routability_check_overflow`, `-routability_max_density`, `-routability_max_bloat_iter`, `-routability_max_inflation_iter`, `-routability_target_rc_metric`, `-routability_inflation_ratio_coef`, `-routability_max_inflation_ratio`, `-routability_rc_coefficients` Timing-driven arguments - They begin with `-timing_driven`. - `-timing_driven_net_reweight_overflow`, `-timing_driven_net_weight_max`, `-timing_driven_nets_percentage` ```tcl global_placement [-timing_driven] [-routability_driven] [-disable_timing_driven] [-disable_routability_driven] [-skip_initial_place] [-incremental] [-bin_grid_count grid_count] [-density target_density] [-init_density_penalty init_density_penalty] [-init_wirelength_coef init_wirelength_coef] [-min_phi_coef min_phi_conef] [-max_phi_coef max_phi_coef] [-reference_hpwl reference_hpwl] [-overflow overflow] [-initial_place_max_iter initial_place_max_iter] [-initial_place_max_fanout initial_place_max_fanout] [-pad_left pad_left] [-pad_right pad_right] [-force_cpu] [-skip_io] [-skip_nesterov_place] [-routability_check_overflow routability_check_overflow] [-routability_max_density routability_max_density] [-routability_max_bloat_iter routability_max_bloat_iter] [-routability_max_inflation_iter routability_max_inflation_iter] [-routability_target_rc_metric routability_target_rc_metric] [-routability_inflation_ratio_coef routability_inflation_ratio_coef] [-routability_max_inflation_ratio routability_max_inflation_ratio] [-routability_rc_coefficients routability_rc_coefficients] [-timing_driven_net_reweight_overflow] [-timing_driven_net_weight_max] [-timing_driven_nets_percentage] ``` #### Options | Switch Name | Description | |-----------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-timing_driven` | Enable timing-driven mode. See [link]() for timing-specific arguments. | | `-routability_driven` | Enable routability-driven mode. See [link]() for routability-specific arguments. | | `-skip_initial_place` | Skip the initial placement (Biconjugate gradient stabilized, or BiCGSTAB solving) before Nesterov placement. Initial placement improves HPWL by ~5% on large designs. Equivalent to `-initial_place_max_iter 0`. | | `-incremental` | Enable the incremental global placement. Users would need to tune other parameters (e.g., `init_density_penalty`) with pre-placed solutions. | | `-bin_grid_count` | Set bin grid’s counts. The internal heuristic defines the default value. Allowed values are integers `[64,128,256,512,...]`. | | `-density` | Set target density. The default value is `0.7` (i.e., 70%). Allowed values are floats `[0, 1]`. | | `-init_density_penalty` | Set initial density penalty. The default value is `8e-5`. Allowed values are floats `[1e-6, 1e6]`. | | `-init_wirelength_coef` | Set initial wirelength coefficient. The default value is `0.25`. Allowed values are floats. | | `-min_phi_coef` | Set `pcof_min` ($\mu_k$ Lower Bound). The default value is `0.95`. Allowed values are floats `[0.95, 1.05]`. | | `-max_phi_coef` | Set `pcof_max` ($\mu_k$ Upper Bound). Default value is 1.05. Allowed values are `[1.00-1.20, float]`. | | `-overflow` | Set target overflow for termination condition. The default value is `0.1`. Allowed values are floats `[0, 1]`. | | `-initial_place_max_iter` | Set maximum iterations in the initial place. The default value is 20. Allowed values are integers `[0, MAX_INT]`. | | `-initial_place_max_fanout` | Set net escape condition in initial place when $fanout \geq initial\_place\_max\_fanout$. The default value is 200. Allowed values are integers `[1, MAX_INT]`. | | `-pad_left` | Set left padding in terms of number of sites. The default value is 0, and the allowed values are integers `[1, MAX_INT]` | | `-pad_right` | Set right padding in terms of number of sites. The default value is 0, and the allowed values are integers `[1, MAX_INT]` | | `-force_cpu` | Force to use the CPU solver even if the GPU is available. | | `-skip_io` | Flag to ignore the IO ports when computing wirelength during placement. The default value is False, allowed values are boolean. | #### Routability-Driven Arguments | Switch Name | Description | |-------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-routability_check_overflow` | Set overflow threshold for routability mode. The default value is `0.2`, and the allowed values are floats `[0, 1]`. | | `-routability_max_density` | Set density threshold for routability mode. The default value is `0.99`, and the allowed values are floats `[0, 1]`. | | `-routability_max_bloat_iter` | Set bloat iteration threshold for routability mode. The default value is `1`, and the allowed values are integers `[1, MAX_INT]`. | | `-routability_max_inflation_iter` | Set inflation iteration threshold for routability mode. The default value is `4`, and the allowed values are integers `[1, MAX_INT]`. | | `-routability_target_rc_metric` | Set target RC metric for routability mode. The default value is `1.25`, and the allowed values are floats. | | `-routability_inflation_ratio_coef` | Set inflation ratio coefficient for routability mode. The default value is `2.5`, and the allowed values are floats. | | `-routability_max_inflation_ratio` | Set inflation ratio threshold for routability mode. The default value is `2.5`, and the allowed values are floats. | | `-routability_rc_coefficients` | Set routability RC coefficients. It comes in the form of a Tcl List `{k1, k2, k3, k4}`. The default value for each coefficient is `{1.0, 1.0, 0.0, 0.0}` respectively, and the allowed values are floats. | #### Timing-Driven Arguments | Switch Name | Description | |----------------------------------------|------------------------------------------------------------------------------------------------------------------------------------| | `-timing_driven_net_reweight_overflow` | Set overflow threshold for timing-driven net reweighting. Allowed value is a Tcl list of integers where each number is `[0, 100]`. | | `-timing_driven_net_weight_max` | Set the multiplier for the most timing-critical nets. The default value is `1.9`, and the allowed values are floats. | | `-timing_driven_nets_percentage` | Set the reweighted percentage of nets in timing-driven mode. The default value is 10. Allowed values are floats `[0, 100]`. | ### Cluster Flops This command does flop clustering based on parameters. ```tcl cluster_flops [-tray_weight tray_weight]\ [-timing_weight timing_weight]\ [-max_split_size max_split_size]\ [-num_paths num_paths] ``` #### Options | Switch Name | Description | |-------------------|------------------------------------------------------| | `-tray_weight` | Tray weight, default value is 20.0, type `float`. | | `-timing_weight` | Timing weight, default value is 1.0, type `float`. | | `-max_split_size` | Maximum split size, default value is -1, type `int`. | | `-num_paths` | KIV, default value is 0, type `int`. | ## Useful Developer Commands If you are a developer, you might find these useful. More details can be found in the [source file]() or the [swig file](). ```default # debugging global placement global_placement_debug -pause -update -inst -draw_bins -initial # adds padding and gets global placement uniform target density get_global_placement_uniform_density -pad_left -pad_right ``` Example scripts demonstrating how to run `gpl` on a sample design on `core01` as follows: ```shell ./test/core01.tcl ``` ## Regression tests There are a set of regression tests in `./test`. For more information, refer to this section. Simply run the following script: ```shell ./test/regression ``` ## Limitations ## Using the Python interface to gpl This API tries to stay close to the API defined in `C++` class `Replace` that is located [here](). When initializing a design, a sequence of Python commands might look like the following: ```python from openroad import Design, Tech tech = Tech() tech.readLef(...) design = Design(tech) design.readDef(...) gpl = design.getReplace() ``` Here is an example of some options / configurations to the global placer. (See [Replace.h]() for a complete list) ```python gpl.setInitialPlaceMaxIter(iter) gpl.setSkipIoMode(skip_io) gpl.setTimingDrivenMode(timing_driven) gpl.setTimingNetWeightMax(weight) ``` There are some useful Python functions located in the file [grt_aux.py]() but these are not considered a part of the *final* API and they may change. ## FAQs Check out [GitHub discussion](https://github.com/The-OpenROAD-Project/OpenROAD/discussions/categories/q-a?discussions_q=category%3AQ%26A+replace+in%3Atitle) about this tool. ## References - C.-K. Cheng, A. B. Kahng, I. Kang and L. Wang, “RePlAce: Advancing Solution Quality and Routability Validation in Global Placement”, IEEE Transactions on Computer-Aided Design of Integrated Circuits and Systems, 38(9) (2019), pp. 1717-1730. [(.pdf)](https://vlsicad.ucsd.edu/Publications/Journals/j126.pdf) - J. Lu, P. Chen, C.-C. Chang, L. Sha, D. J.-H. Huang, C.-C. Teng and C.-K. Cheng, “ePlace: Electrostatics based Placement using Fast Fourier Transform and Nesterov’s Method”, ACM TODAES 20(2) (2015), article 17. [(.pdf)](https://cseweb.ucsd.edu/~jlu/papers/eplace-todaes14/paper.pdf) - J. Lu, H. Zhuang, P. Chen, H. Chang, C.-C. Chang, Y.-C. Wong, L. Sha, D. J.-H. Huang, Y. Luo, C.-C. Teng and C.-K. Cheng, “ePlace-MS: Electrostatics based Placement for Mixed-Size Circuits”, IEEE TCAD 34(5) (2015), pp. 685-698. [(.pdf)](https://cseweb.ucsd.edu/~jlu/papers/eplace-ms-tcad14/paper.pdf) - A. B. Kahng, J. Li and L. Wang,<br /> \\\\ “Improved Flop Tray-Based Design Implementation for Power Reduction”,<br /> \\\\ IEEE/ACM ICCAD, 2016, pp. 20:1-20:8. - The timing-driven mode has been implemented by Mingyu Woo (only available in [legacy repo in standalone branch](https://github.com/The-OpenROAD-Project/RePlAce/tree/standalone).) - The routability-driven mode has been implemented by Mingyu Woo. - Timing-driven mode re-implementation is ongoing with the current clean-code structure. ## Authors - Authors/maintainer since Jan 2020: Mingyu Woo (Ph.D. Advisor: Andrew. B. Kahng) - Original open-sourcing of RePlAce: August 2018, by Ilgweon Kang (Ph.D. Advisor: Chung-Kuan Cheng), Lutong Wang (Ph.D. Advisor: Andrew B. Kahng), and Mingyu Woo (Ph.D. Advisor: Andrew B. Kahng). - Also thanks to Dr. Jingwei Lu for open-sourcing the previous ePlace-MS/ePlace project code. ## License BSD 3-Clause License. See [LICENSE]() file.