diff --git a/.github/workflows/black.yaml b/.github/workflows/black.yaml index bcca7ef110..65a69b50e8 100644 --- a/.github/workflows/black.yaml +++ b/.github/workflows/black.yaml @@ -5,5 +5,5 @@ jobs: lint: runs-on: ${{ vars.USE_SELF_HOSTED == 'true' && 'self-hosted' || 'ubuntu-latest' }} steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - uses: psf/black@stable diff --git a/.github/workflows/github-actions-cron-test-installer.yml b/.github/workflows/github-actions-cron-test-installer.yml index fd16918e50..9500f1a570 100644 --- a/.github/workflows/github-actions-cron-test-installer.yml +++ b/.github/workflows/github-actions-cron-test-installer.yml @@ -30,7 +30,7 @@ jobs: runs-on: ${{ vars.USE_SELF_HOSTED == 'true' && 'self-hosted' || 'ubuntu-latest' }} steps: - name: Check out repository code - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: fetch-depth: 1 submodules: recursive diff --git a/.github/workflows/github-actions-cron-update-OR.yml b/.github/workflows/github-actions-cron-update-OR.yml index 29ebac9589..1784acb15e 100644 --- a/.github/workflows/github-actions-cron-update-OR.yml +++ b/.github/workflows/github-actions-cron-update-OR.yml @@ -10,7 +10,7 @@ jobs: runs-on: ${{ vars.USE_SELF_HOSTED == 'true' && 'self-hosted' || 'ubuntu-latest' }} steps: - name: Check out repository code recursively - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: submodules: recursive - name: Pull changes in OpenROAD submodule diff --git a/.github/workflows/github-actions-cron-update-yosys.yml b/.github/workflows/github-actions-cron-update-yosys.yml index 22d1caff51..11bab5fe55 100644 --- a/.github/workflows/github-actions-cron-update-yosys.yml +++ b/.github/workflows/github-actions-cron-update-yosys.yml @@ -11,7 +11,7 @@ jobs: runs-on: ${{ vars.USE_SELF_HOSTED == 'true' && 'self-hosted' || 'ubuntu-latest' }} steps: - name: Check out repository code recursively - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: submodules: recursive fetch-depth: 0 diff --git a/.github/workflows/github-actions-cron-util-test.yml b/.github/workflows/github-actions-cron-util-test.yml index 9afdae08ca..e2636fc7ad 100644 --- a/.github/workflows/github-actions-cron-util-test.yml +++ b/.github/workflows/github-actions-cron-util-test.yml @@ -20,7 +20,7 @@ jobs: runs-on: ${{ vars.USE_SELF_HOSTED == 'true' && 'self-hosted' || 'ubuntu-latest' }} steps: - name: Check out repository code - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: fetch-depth: 1 submodules: recursive diff --git a/.github/workflows/github-actions-lint-tcl.yml b/.github/workflows/github-actions-lint-tcl.yml index 4b34d73322..1123134167 100644 --- a/.github/workflows/github-actions-lint-tcl.yml +++ b/.github/workflows/github-actions-lint-tcl.yml @@ -9,16 +9,16 @@ on: - master jobs: - build: + Tclint: runs-on: ${{ vars.USE_SELF_HOSTED == 'true' && 'self-hosted' || 'ubuntu-latest' }} steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Install Dependencies run: | python3 -m venv venv - venv/bin/pip install tclint==0.4.2 + venv/bin/pip install tclint==0.7.0 - name: Lint run: | @@ -26,4 +26,4 @@ jobs: tclfmt --version tclfmt --in-place . git diff --exit-code - tclint --no-check-style . + tclint . diff --git a/.github/workflows/github-actions-manual-update-rules.yml b/.github/workflows/github-actions-manual-update-rules.yml index f5ea682ef7..8a3b92b5c8 100644 --- a/.github/workflows/github-actions-manual-update-rules.yml +++ b/.github/workflows/github-actions-manual-update-rules.yml @@ -14,7 +14,7 @@ jobs: fail-fast: false steps: - name: Check out repository code recursively - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: fetch-depth: 0 - uses: actions/setup-python@v6 diff --git a/.github/workflows/github-actions-on-push.yml b/.github/workflows/github-actions-on-push.yml index a4cba86dd8..c14161c221 100644 --- a/.github/workflows/github-actions-on-push.yml +++ b/.github/workflows/github-actions-on-push.yml @@ -11,6 +11,6 @@ jobs: runs-on: ${{ vars.USE_SELF_HOSTED == 'true' && 'self-hosted' || 'ubuntu-latest' }} steps: - name: Check out repository code - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: run security_scan_on_push uses: The-OpenROAD-Project/actions/security_scan_on_push@main diff --git a/.github/workflows/github-actions-publish-docker-images.yml b/.github/workflows/github-actions-publish-docker-images.yml index 5a7d60a975..ef64cc8e30 100644 --- a/.github/workflows/github-actions-publish-docker-images.yml +++ b/.github/workflows/github-actions-publish-docker-images.yml @@ -30,7 +30,7 @@ jobs: runs-on: ${{ vars.USE_SELF_HOSTED == 'true' && 'self-hosted' || 'ubuntu-latest' }} timeout-minutes: 600 steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Set environment variables run: echo "IMAGE=ghcr.io/$(echo ${{ github.repository }} | tr '[:upper:]' '[:lower:]')" >> $GITHUB_ENV @@ -64,7 +64,7 @@ jobs: runs-on: ${{ vars.USE_SELF_HOSTED == 'true' && 'self-hosted' || 'ubuntu-latest' }} steps: - name: Check out repository code - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: fetch-depth: 1 submodules: recursive @@ -113,7 +113,7 @@ jobs: tool-cache: false - name: Check out repository code - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: fetch-depth: 1 submodules: recursive diff --git a/.github/workflows/github-actions-update-rules.yml b/.github/workflows/github-actions-update-rules.yml index 9350ed41c8..6f85145a7d 100644 --- a/.github/workflows/github-actions-update-rules.yml +++ b/.github/workflows/github-actions-update-rules.yml @@ -11,7 +11,7 @@ jobs: fail-fast: false steps: - name: Check out repository code recursively - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: fetch-depth: 0 - name: Git prep diff --git a/.github/workflows/github-actions-yaml-test.yml b/.github/workflows/github-actions-yaml-test.yml index ad54a2625f..65d073f577 100644 --- a/.github/workflows/github-actions-yaml-test.yml +++ b/.github/workflows/github-actions-yaml-test.yml @@ -10,7 +10,7 @@ jobs: runs-on: ${{ vars.USE_SELF_HOSTED == 'true' && 'self-hosted' || 'ubuntu-latest' }} steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: fetch-depth: 1 sparse-checkout: | diff --git a/.gitmodules b/.gitmodules index ec90369ba8..32bdbc7301 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,3 +7,6 @@ [submodule "tools/yosys-slang"] path = tools/yosys-slang url = https://github.com/povik/yosys-slang.git +[submodule "tools/kepler-formal"] + path = tools/kepler-formal + url = https://github.com/keplertech/kepler-formal diff --git a/README.md b/README.md index dcb8be5791..177c240986 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,17 @@ timeline ## Tool Installation -There are different ways to install and develop OpenROAD and ORFS, which is the best fit depends use-case, experience and personal taste. +There are multiple ways to install and develop OpenROAD and ORFS. However, the best option depends on your use case, experience level, and personal preference. + + +> **Recommendation for new users:** +> If you are new to OpenROAD-flow-scripts, Docker can be a reliable way to get started since it avoids most dependency and environment issues. +> +> On supported platforms, using the pre-built binaries can be an even simpler option as it avoids building from source. +> +> Alternatively, the Bazel-based flow also avoids manual dependency installation (aside from installing Bazelisk itself), similar to how Docker requires installing Docker. + + ### Use Bazel, avoid installing anything at all and adapt the flow to your needs in your own repository diff --git a/build_openroad.sh b/build_openroad.sh index 6350784bc1..74303aa69e 100755 --- a/build_openroad.sh +++ b/build_openroad.sh @@ -29,6 +29,10 @@ OPENROAD_APP_ARGS="" DOCKER_OS_NAME="ubuntu22.04" PROC=-1 +VERIFIC_COMPONENTS='database util containers pct hier_tree verilog' +WITH_VERIFIC=0 +VERIFIC_DIR="" + function usage() { cat << EOF @@ -36,6 +40,7 @@ Usage: $0 [-h|--help] [-o|--local] [-l|--latest] [--or_branch BRANCH_NAME] [--or_repo REPO_URL] [--no_init] [-n|--nice] [-t|--threads N] [--yosys-args-overwrite] [--yosys-args STRING] + [--with-verific PATH] [--openroad-args-overwrite] [--openroad-args STRING] [--install-path PATH] [--clean] [--clean-force] @@ -67,6 +72,9 @@ Options: --yosys-args STRING Additional compilation flags for Yosys compilation. + --with-verific PATH Compile Yosys with Verific support. PATH is the path + to the Verific source folder. + --openroad-args-overwrite Do not use default flags set by this scrip during OpenROAD app compilation. @@ -140,6 +148,19 @@ while (( "$#" )); do YOSYS_USER_ARGS="$2" shift ;; + --with-verific) + YOSYS_USER_ARGS+=" ENABLE_VERIFIC=1" + YOSYS_USER_ARGS+=" ENABLE_VERIFIC_VHDL=0" + YOSYS_USER_ARGS+=" VERIFIC_COMPONENTS='${VERIFIC_COMPONENTS}'" + VERIFIC_DIR=${2} + if [ ! -d "${VERIFIC_DIR}" ]; then + echo "[ERROR] Verific path '${VERIFIC_DIR}' does not exist." >&2 + exit 1 + fi + YOSYS_USER_ARGS+=" VERIFIC_DIR=${VERIFIC_DIR}" + WITH_VERIFIC=1 + shift + ;; --openroad-args-overwrite) OPENROAD_APP_OVERWRITE_ARGS=1 ;; @@ -254,13 +275,38 @@ __local_build() git --work-tree=${YOSYS_ABC_PATH} --git-dir=${YOSYS_ABC_PATH}/.git update-index --refresh fi + if [ ${WITH_VERIFIC} -eq 1 ]; then + echo "[INFO FLW-0031] Compiling Verific components." + cp -r "${VERIFIC_DIR}" verific + for c in ${VERIFIC_COMPONENTS}; do + make -j -C "verific/${c}" clean + make -j -C "verific/${c}" + done + fi + echo "[INFO FLW-0017] Compiling Yosys." - ${NICE} make install -C tools/yosys -j "${PROC}" ${YOSYS_ARGS} + eval ${NICE} make install -C tools/yosys -j "${PROC}" ${YOSYS_ARGS} echo "[INFO FLW-0030] Compiling yosys-slang." # CMAKE_FLAGS added to work around yosys-slang#141 (unable to build outside of git checkout) ${NICE} make install -C tools/yosys-slang -j "${PROC}" YOSYS_PREFIX="${INSTALL_PATH}/yosys/bin/" CMAKE_FLAGS="-DYOSYS_SLANG_REVISION=unknown -DSLANG_REVISION=unknown" + echo "[INFO FLW-0031] Compiling kepler-formal" + ${NICE} cmake -B tools/kepler-formal/build tools/kepler-formal \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_CXX_FLAGS_RELEASE="-Ofast -march=native -ffast-math -flto" \ + -DCMAKE_EXE_LINKER_FLAGS="-flto" \ + -DCMAKE_BUILD_RPATH="${DIR}/tools/kepler-formal/build/thirdparty/naja/src/dnl:${DIR}/tools/kepler-formal/build/thirdparty/naja/src/nl/nl:${DIR}/tools/kepler-formal/build/thirdparty/naja/src/optimization" \ + -DCMAKE_INSTALL_RPATH="${INSTALL_PATH}/kepler-formal/lib" \ + -DCMAKE_BUILD_WITH_INSTALL_RPATH=OFF \ + -DCMAKE_INSTALL_RPATH_USE_LINK_PATH=OFF \ + -DCMAKE_INSTALL_PREFIX="${INSTALL_PATH}/kepler-formal" + ${NICE} cmake --build tools/kepler-formal/build --target install -j "${PROC}" + + if [ ${WITH_VERIFIC} -eq 1 ]; then + echo "[INFO FLW-0032] Cleaning up Verific components." + rm -rf verific + fi } __update_openroad_app_remote() diff --git a/docs/user/BuildWithDocker.md b/docs/user/BuildWithDocker.md index 4f85031d51..96bd329b48 100644 --- a/docs/user/BuildWithDocker.md +++ b/docs/user/BuildWithDocker.md @@ -77,7 +77,7 @@ You can restrict the number of CPUs with the `-t|--threads N` argument: The binaries are only available from inside a Docker container. Here is an example of starting a container from the created Docker image. ``` shell -docker run --rm -it -u $(id -u ${USER}):$(id -g ${USER}) -v $(pwd)/flow:/OpenROAD-flow-scripts/flow openroad/flow-ubuntu22.04-builder +docker run --rm -it -u $(id -u ${USER}):$(id -g ${USER}) -v $(pwd)/flow:/OpenROAD-flow-scripts/flow openroad/orfs ``` Then, inside docker: @@ -116,7 +116,7 @@ docker run --rm -it \ -v ${HOME}/.Xauthority:/.Xauthority \ --network host \ --security-opt seccomp=unconfined \ - openroad/flow-$OS_NAME-builder + openroad/orfs ``` Running GUI with Docker on Mac OS X users, refer [here](https://cntnr.io/running-guis-with-docker-on-mac-os-x-a14df6a76efc). diff --git a/docs/user/FlowVariables.md b/docs/user/FlowVariables.md index dbf7d4bb62..59d919b223 100644 --- a/docs/user/FlowVariables.md +++ b/docs/user/FlowVariables.md @@ -95,22 +95,23 @@ configuration file. | ABC_DRIVER_CELL| Default driver cell used during ABC synthesis.| | | ABC_LOAD_IN_FF| During synthesis set_load value used.| | | ABSTRACT_SOURCE| Which .odb file to use to create abstract| | -| ADDER_MAP_FILE| List of adders treated as a black box by Yosys.| | +| ADDER_MAP_FILE| Optional mapping file supplied to Yosys to map adders| | | ADDITIONAL_FILES| Additional files to be added to `make issue` archive.| | | ADDITIONAL_GDS| Hardened macro GDS files listed here.| | | ADDITIONAL_LEFS| Hardened macro LEF view files listed here. The LEF information of the macros is immutable and used throughout all stages. Stored in the .odb file.| | | ADDITIONAL_LIBS| Hardened macro library files listed here. The library information is immutable and used throughout all stages. Not stored in the .odb file.| | | BALANCE_ROWS| Balance rows during placement.| 0| | BLOCKS| Blocks used as hard macros in a hierarchical flow. Do note that you have to specify block-specific inputs file in the directory mentioned by Makefile.| | +| BUFFER_PORTS_ARGS| Specify arguments to the buffer_ports call during placement. Only used if DONT_BUFFER_PORTS=0.| | | CAP_MARGIN| Specifies a capacitance margin when fixing max capacitance violations. This option allows you to overfix.| | | CDL_FILES| Insert additional Circuit Description Language (`.cdl`) netlist files.| | | CELL_PAD_IN_SITES_DETAIL_PLACEMENT| Cell padding on both sides in site widths to ease routability in detail placement.| 0| | CELL_PAD_IN_SITES_GLOBAL_PLACEMENT| Cell padding on both sides in site widths to ease routability during global placement.| 0| -| CLKGATE_MAP_FILE| List of cells for gating clock treated as a black box by Yosys.| | +| CLKGATE_MAP_FILE| Optional mapping file supplied to Yosys to map clock gating cells| | | CLUSTER_FLOPS| Minimum number of flip-flops per sink cluster.| 0| | CORE_AREA| The core area specified as a list of lower-left and upper-right corners in microns (X1 Y1 X2 Y2).| | -| CORE_ASPECT_RATIO| The core aspect ratio (height / width). This value is ignored if `CORE_UTILIZATION` is undefined.| 1.0| -| CORE_MARGIN| The margin between the core area and die area, specified 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}`. This variable is ignored if `CORE_UTILIZATION` is undefined.| 1.0| +| CORE_ASPECT_RATIO| The core aspect ratio (height / width). This variable is only used when `CORE_UTILIZATION` is set.| 1.0| +| CORE_MARGIN| The margin between the core area and die area, specified 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}`. This variable is only used when `CORE_UTILIZATION` is set.| 1.0| | CORE_UTILIZATION| The core utilization percentage (0-100).| | | CORNER| PVT corner library selection. Only available for ASAP7 and GF180 PDKs.| | | CTS_ARGS| Override `clock_tree_synthesis` arguments.| | @@ -127,6 +128,7 @@ configuration file. | DETAILED_ROUTE_ARGS| Add additional arguments for debugging purposes during detail route.| | | DETAILED_ROUTE_END_ITERATION| Maximum number of iterations.| 64| | DFF_LIB_FILES| Technology mapping liberty files for flip-flops.| | +| DFF_MAP_FILE| Optional mapping file supplied to Yosys to map D flip-flops| | | DIE_AREA| The die area specified as a list of lower-left and upper-right corners in microns (X1 Y1 X2 Y2).| | | DONT_BUFFER_PORTS| Do not buffer input/output ports during floorplanning.| 0| | DONT_USE_CELLS| Dont use cells eases pin access in detailed routing.| | @@ -141,7 +143,7 @@ configuration file. | FLOW_VARIANT| Flow variant to use, used in the flow variant directory name.| base| | FOOTPRINT| Custom footprint definition file for ICeWall-based floorplan initialization. Mutually exclusive with FLOORPLAN_DEF or DIE_AREA/CORE_AREA or CORE_UTILIZATION.| | | FOOTPRINT_TCL| Specifies a Tcl script with custom footprint-related commands for floorplan setup.| | -| GDS_ALLOW_EMPTY| Regular expression of module names of macros that have no .gds file| | +| GDS_ALLOW_EMPTY| Single regular expression of module names of macros that have no .gds file| | | GDS_FILES| Path to platform GDS files.| | | GENERATE_ARTIFACTS_ON_FAILURE| For instance Bazel needs artifacts (.odb and .rpt files) on a failure to allow the user to save hours on re-running the failed step locally, but when working with a Makefile flow, it is more natural to fail the step and leave the user to manually inspect the logs and artifacts directly via the file system. Set to 1 to change the behavior to generate artifacts upon failure to e.g. do a global route. The exit code will still be non-zero on all other failures that aren't covered by the "useful to inspect the artifacts on failure" use-case. Example: just like detailed routing, a global route that fails with congestion, is not a build failure(as in exit code non-zero), it is a successful(as in zero exit code) global route that produce reports detailing the problem. Detailed route will not proceed, if there is global routing congestion This allows build systems, such as bazel, to create artifacts for global and detailed route, even if the operation had problems, without having know about the semantics between global and detailed route. Considering that global and detailed route can run for a long time and use a lot of memory, this allows inspecting results on a laptop for a build that ran on a server.| 0| | GLOBAL_PLACEMENT_ARGS| Use additional tuning parameters during global placement other than default args defined in global_place.tcl.| | @@ -155,8 +157,10 @@ configuration file. | IO_PLACER_H| A list of metal layers on which the I/O pins are placed horizontally (top and bottom of the die).| | | IO_PLACER_V| A list of metal layers on which the I/O pins are placed vertically (sides of the die).| | | IR_DROP_LAYER| Default metal layer to report IR drop.| | +| KEEP_VARS| Feature toggle to keep intermediate variables during the flow. This is useful for the single-run flow, where all stages of the flow are run in a single OpenROAD instance.| 0| | KLAYOUT_TECH_FILE| A mapping from LEF/DEF to GDS using the KLayout tool.| | -| LATCH_MAP_FILE| List of latches treated as a black box by Yosys.| | +| LATCH_MAP_FILE| Optional mapping file supplied to Yosys to map latches| | +| LAYER_PARASITICS_FILE| Path to per layer parasitics file. Defaults to $(PLATFORM_DIR)/setRC.tcl.| | | LIB_FILES| A Liberty file of the standard cell library with PVT characterization, input and output characteristics, timing and power definitions for each cell.| | | MACRO_BLOCKAGE_HALO| Distance beyond the edges of a macro that will also be covered by the blockage generated for that macro. Note that the default macro blockage halo comes from the largest of the specified MACRO_PLACE_HALO x or y values. This variable overrides that calculation.| | | MACRO_EXTENSION| Sets the number of GCells added to the blockages boundaries from macros.| | @@ -167,12 +171,15 @@ configuration file. | MACRO_WRAPPERS| The wrapper file that replaces existing macros with their wrapped version.| | | MAKE_TRACKS| Tcl file that defines add routing tracks to a floorplan.| | | MATCH_CELL_FOOTPRINT| Enforce sizing operations to only swap cells that have the same layout boundary.| 0| +| MAX_PLACE_STEP_COEF| Sets the maximum phi coefficient (pcof_max / µ_k Upper Bound) for global placement optimization. This parameter controls the step size upper bound in the RePlAce Nesterov optimization algorithm. Higher values allow more aggressive optimization but may risk divergence. Valid range: 1.00-1.20| 1.05| | MAX_REPAIR_ANTENNAS_ITER_DRT| Defines the maximum number of iterations post-detailed routing repair antennas will run.| 5| | MAX_REPAIR_ANTENNAS_ITER_GRT| Defines the maximum number of iterations post global routing repair antennas will run.| 5| | MAX_REPAIR_TIMING_ITER| Maximum number of iterations for repair setup and repair hold.| | | MAX_ROUTING_LAYER| The highest metal layer name to be used in routing.| | | MIN_BUF_CELL_AND_PORTS| Used to insert a buffer cell to pass through wires. Used in synthesis.| | +| MIN_PLACE_STEP_COEF| Sets the minimum phi coefficient (pcof_min / µ_k Lower Bound) for global placement optimization. This parameter controls the step size lower bound in the RePlAce Nesterov optimization algorithm. Lower values may improve convergence but can increase runtime. Valid range: 0.95-1.05| 0.95| | MIN_ROUTING_LAYER| The lowest metal layer name to be used in routing.| | +| NUM_CORES| Passed to `openroad -threads $(NUM_CORES)`, defaults to numbers of cores in system as determined by system specific code in Makefile, `nproc` is tried first. OpenROAD does not limit itself to this number of cores across OpenROAD running instances, which can lead to overprovisioning in contexts such as bazel-orfs where there could be many routing, or place jobs running at the same time.| | | OPENROAD_HIERARCHICAL| Feature toggle to enable to run OpenROAD in hierarchical mode, otherwise considered flat. Will eventually be the default and this option will be retired.| 0| | PDN_TCL| File path which has a set of power grid policies used by pdn to be applied to the design, such as layers to use, stripe width and spacing to generate the actual metal straps.| | | PLACE_DENSITY| The desired average placement density of cells: 1.0 = dense, 0.0 = widely spread. The intended effort is also communicated by this parameter. Use a low value for faster builds and higher value for better quality of results. If a too low value is used, the placer will not be able to place all cells and a recommended minimum placement density can be found in the logs. A too high value can lead to excessive runtimes, even timeouts and subtle failures in the flow after placement, such as in CTS or global routing when timing repair fails. The default is platform specific.| | @@ -195,11 +202,11 @@ configuration file. | RTLMP_AREA_WT| Weight for the area of the current floorplan.| 0.1| | RTLMP_ARGS| Overrides all other RTL macro placer arguments.| | | RTLMP_BOUNDARY_WT| Weight for the boundary or how far the hard macro clusters are from boundaries.| 50.0| -| RTLMP_DEAD_SPACE| Specifies the target dead space percentage, which influences the utilization of a cluster.| 0.05| +| RTLMP_DATA_FLOW_DRIVEN| Specifies whether the macro placer should use data-flow driven macro placement. Data-flow driven works by adding a wire length component that takes into account the data paths of the design. This optional can increase run time significantly for large designs.| 1| | RTLMP_FENCE_LX| Defines the lower left X coordinate for the global fence bounding box in microns.| 0.0| | RTLMP_FENCE_LY| Defines the lower left Y coordinate for the global fence bounding box in microns.| 0.0| -| RTLMP_FENCE_UX| Defines the upper right X coordinate for the global fence bounding box in microns.| 100000000.0| -| RTLMP_FENCE_UY| Defines the upper right Y coordinate for the global fence bounding box in microns.| 100000000.0| +| RTLMP_FENCE_UX| Defines the upper right X coordinate for the global fence bounding box in microns.| 0.0| +| RTLMP_FENCE_UY| Defines the upper right Y coordinate for the global fence bounding box in microns.| 0.0| | RTLMP_MAX_INST| Maximum number of standard cells in a cluster. If unset, rtl_macro_placer will calculate a value based on the design attributes.| | | RTLMP_MAX_LEVEL| Maximum depth of the physical hierarchy tree.| 2| | RTLMP_MAX_MACRO| Maximum number of macros in a cluster. If unset, rtl_macro_placer will calculate a value based on the design attributes.| | @@ -236,18 +243,23 @@ configuration file. | SLEW_MARGIN| Specifies a slew margin when fixing max slew violations. This option allows you to overfix.| | | SWAP_ARITH_OPERATORS| Improve timing QoR by swapping ALU and MULT arithmetic operators.| | | SYNTH_ARGS| Optional synthesis variables for yosys.| | -| SYNTH_BLACKBOXES| List of cells treated as a black box by Yosys. With Bazel, this can be used to run synthesis in parallel for the large modules of the design.| | +| SYNTH_BLACKBOXES| List of cells treated as a black box by Yosys. With Bazel, this can be used to run synthesis in parallel for the large modules of the design. Non-existant modules are ignored silently, useful when listing modules statically, even if modules come and go dynamically.| | | SYNTH_CANONICALIZE_TCL| Specifies a Tcl script with commands to run as part of the synth canonicalize step.| | | SYNTH_GUT| Load design and remove all internal logic before doing synthesis. This is useful when creating a mock .lef abstract that has a smaller area than the amount of logic would allow. bazel-orfs uses this to mock SRAMs, for instance.| 0| | SYNTH_HDL_FRONTEND| Select an alternative language frontend to ingest the design. Available option is "slang". If the variable is empty, design is read with the Yosys read_verilog command.| | | SYNTH_HIERARCHICAL| Enable to Synthesis hierarchically, otherwise considered flat synthesis.| 0| | SYNTH_HIER_SEPARATOR| Separator used for the synthesis flatten stage.| .| +| SYNTH_INSBUF| Insert input buffers on top-level input ports during synthesis. Useful to disable when doing parallel synthesis and concatenating netlists later as we're generating netlists of submodules.| 1| +| SYNTH_KEEP_MOCKED_MEMORIES| When `SYNTH_MOCK_LARGE_MEMORIES=1`, setting this to 1, will keep mocked memories (not flattening them). This preserves some of the access logic complexity and avoids optimizations outside of the mocked memory.| 1| | SYNTH_KEEP_MODULES| Mark modules to keep from getting removed in flattening.| | -| SYNTH_MEMORY_MAX_BITS| Maximum number of bits for memory synthesis.| 4096| +| SYNTH_MEMORY_MAX_BITS| Maximum number of bits for memory synthesis. Ideally, real RAM or realistic fakeram should be used for RAMs much larger than 1024 bits. To temporarily ignore the RAM concerns and investigate other aspects of the design, consider setting `SYNTH_MOCK_LARGE_MEMORIES=1`, or adjusting `SYNTH_MEMORY_MAX_BITS`.| 4096| | SYNTH_MINIMUM_KEEP_SIZE| For hierarchical synthesis, we keep modules of larger area than given by this variable and flatten smaller modules. The area unit used is the size of a basic nand2 gate from the platform's standard cell library. The default value is platform specific.| 0| +| SYNTH_MOCK_LARGE_MEMORIES| Reduce Yosys inferred memories larger than SYNTH_MEMORY_MAX_BITS to 1 row. Yosys will generally infer memories from behavioral Verilog code, whether the memories are in standalone modules or instantiated within some larger module. fakeram and empty Verilog memories(blackboxes) of memories will not be inferred memories by Yosys and are therefore not affected by this variable. This is useful and convenient to separate the concern of instantiating and placing memories from investigating other issues with a design, though it comes at the expense of the increased accuracy that using realistic fakemem would provide. Memories with a single 1 row will of course have unrealistically good timing and area characteristics, but timing will still correctly terminate in a register. Large port memories, typically register files, will still have the retain a lot of the port logic that can be useful to investigate issues. This can be especially useful during development of designs where the behavioral model comes first and suitable memories are matched up when the design RTL is stable. A typical use case would be Chisel which will generate a behavioral model for a memories with the required clocks, ports, etc. in addition to a computer readable file with the specification of the memories that is used to [automatically](https://chipyard.readthedocs.io/en/stable/Tools/Barstools.html/) match up suitable memory macros later in the flow. During an architectural screening study, a large range of memory configurations can be investigated quickly with this option, without getting bogged down in the concern of how to realize the memories in silicon for emphemral RTL configurations that exist only long enough to run through the ORFS flow to create a table of some characteristics of a design configuration.| 0| | SYNTH_NETLIST_FILES| Skips synthesis and uses the supplied netlist files. If the netlist files contains duplicate modules, which can happen when using hierarchical synthesis on indvidual netlist files and combining here, subsequent modules are silently ignored and only the first module is used.| | | SYNTH_OPT_HIER| Optimize constants across hierarchical boundaries.| | +| SYNTH_REPEATABLE_BUILD| License to prune anything that makes builds less repeatable, typically used with Bazel to ensure that builds are bit-for-bit identical so that caching works optimally. Removes debug information that encodes paths, timestamps, etc.| 0| | SYNTH_RETIME_MODULES| *This is an experimental option and may cause adverse effects.* *No effort has been made to check if the retimed RTL is logically equivalent to the non-retimed RTL.* List of modules to apply automatic retiming to. These modules must not get dissolved and as such they should either be the top module or be included in SYNTH_KEEP_MODULES. The main use case is to quickly identify if performance can be improved by manually retiming the input RTL. Retiming will treat module ports like register endpoints/startpoints. The objective function of retiming isn't informed by SDC, even the clock period is ignored. As such, retiming will optimize for best delay at potentially high register number cost. Automatic retiming can produce suboptimal results as its timing model is crude and it doesn't find the optimal distribution of registers on long pipelines. See OR discussion #8080.| | +| SYNTH_SLANG_ARGS| Additional arguments passed to the slang frontend during synthesis.| | | SYNTH_WRAPPED_ADDERS| Specify the adder modules that can be used for synthesis, separated by commas. The default adder module is determined by the first element of this variable.| | | SYNTH_WRAPPED_MULTIPLIERS| Specify the multiplier modules that can be used for synthesis, separated by commas. The default multiplier module is determined by the first element of this variable.| | | SYNTH_WRAPPED_OPERATORS| Synthesize multiple architectural options for each arithmetic operator in the design. These options are available for switching among in later stages of the flow.| | @@ -262,7 +274,8 @@ configuration file. | VERILOG_DEFINES| Preprocessor defines passed to the language frontend. Example: `-D HPDCACHE_ASSERT_OFF`| | | VERILOG_FILES| The path to the design Verilog/SystemVerilog files providing a description of modules.| | | VERILOG_INCLUDE_DIRS| Specifies the include directories for the Verilog input files.| | -| VERILOG_TOP_PARAMS| Apply toplevel params (if exist).| | +| VERILOG_TOP_PARAMS| Apply toplevel params (if exist). Passed in as a list of key value pairs in tcl syntax; separated by spaces: PARAM1 VALUE1 PARAM2 VALUE2| | +| WRITE_ODB_AND_SDC_EACH_STAGE| Save out .sdc and .odb file after each stage, useful to disable when using a single OpenROAD instance to run all stages of the flow.| 1| | YOSYS_FLAGS| Flags to pass to yosys.| -v 3| ## synth variables @@ -272,21 +285,29 @@ configuration file. - [ABC_LOAD_IN_FF](#ABC_LOAD_IN_FF) - [ADDER_MAP_FILE](#ADDER_MAP_FILE) - [CLKGATE_MAP_FILE](#CLKGATE_MAP_FILE) +- [DFF_MAP_FILE](#DFF_MAP_FILE) - [LATCH_MAP_FILE](#LATCH_MAP_FILE) - [MIN_BUF_CELL_AND_PORTS](#MIN_BUF_CELL_AND_PORTS) - [SDC_FILE](#SDC_FILE) - [SDC_GUT](#SDC_GUT) +- [SYNTH_ARGS](#SYNTH_ARGS) - [SYNTH_BLACKBOXES](#SYNTH_BLACKBOXES) - [SYNTH_CANONICALIZE_TCL](#SYNTH_CANONICALIZE_TCL) - [SYNTH_GUT](#SYNTH_GUT) - [SYNTH_HDL_FRONTEND](#SYNTH_HDL_FRONTEND) - [SYNTH_HIERARCHICAL](#SYNTH_HIERARCHICAL) +- [SYNTH_HIER_SEPARATOR](#SYNTH_HIER_SEPARATOR) +- [SYNTH_INSBUF](#SYNTH_INSBUF) +- [SYNTH_KEEP_MOCKED_MEMORIES](#SYNTH_KEEP_MOCKED_MEMORIES) - [SYNTH_KEEP_MODULES](#SYNTH_KEEP_MODULES) - [SYNTH_MEMORY_MAX_BITS](#SYNTH_MEMORY_MAX_BITS) - [SYNTH_MINIMUM_KEEP_SIZE](#SYNTH_MINIMUM_KEEP_SIZE) +- [SYNTH_MOCK_LARGE_MEMORIES](#SYNTH_MOCK_LARGE_MEMORIES) - [SYNTH_NETLIST_FILES](#SYNTH_NETLIST_FILES) - [SYNTH_OPT_HIER](#SYNTH_OPT_HIER) +- [SYNTH_REPEATABLE_BUILD](#SYNTH_REPEATABLE_BUILD) - [SYNTH_RETIME_MODULES](#SYNTH_RETIME_MODULES) +- [SYNTH_SLANG_ARGS](#SYNTH_SLANG_ARGS) - [SYNTH_WRAPPED_ADDERS](#SYNTH_WRAPPED_ADDERS) - [SYNTH_WRAPPED_MULTIPLIERS](#SYNTH_WRAPPED_MULTIPLIERS) - [TIEHI_CELL_AND_PORT](#TIEHI_CELL_AND_PORT) @@ -330,7 +351,7 @@ configuration file. - [RTLMP_AREA_WT](#RTLMP_AREA_WT) - [RTLMP_ARGS](#RTLMP_ARGS) - [RTLMP_BOUNDARY_WT](#RTLMP_BOUNDARY_WT) -- [RTLMP_DEAD_SPACE](#RTLMP_DEAD_SPACE) +- [RTLMP_DATA_FLOW_DRIVEN](#RTLMP_DATA_FLOW_DRIVEN) - [RTLMP_FENCE_LX](#RTLMP_FENCE_LX) - [RTLMP_FENCE_LY](#RTLMP_FENCE_LY) - [RTLMP_FENCE_UX](#RTLMP_FENCE_UX) @@ -363,19 +384,23 @@ configuration file. ## place variables - [BALANCE_ROWS](#BALANCE_ROWS) +- [BUFFER_PORTS_ARGS](#BUFFER_PORTS_ARGS) - [CELL_PAD_IN_SITES_DETAIL_PLACEMENT](#CELL_PAD_IN_SITES_DETAIL_PLACEMENT) - [CELL_PAD_IN_SITES_GLOBAL_PLACEMENT](#CELL_PAD_IN_SITES_GLOBAL_PLACEMENT) - [CLUSTER_FLOPS](#CLUSTER_FLOPS) - [DONT_BUFFER_PORTS](#DONT_BUFFER_PORTS) - [EARLY_SIZING_CAP_RATIO](#EARLY_SIZING_CAP_RATIO) - [FLOORPLAN_DEF](#FLOORPLAN_DEF) +- [GLOBAL_PLACEMENT_ARGS](#GLOBAL_PLACEMENT_ARGS) - [GPL_ROUTABILITY_DRIVEN](#GPL_ROUTABILITY_DRIVEN) - [GPL_TIMING_DRIVEN](#GPL_TIMING_DRIVEN) - [IO_PLACER_H](#IO_PLACER_H) - [IO_PLACER_V](#IO_PLACER_V) - [MATCH_CELL_FOOTPRINT](#MATCH_CELL_FOOTPRINT) +- [MAX_PLACE_STEP_COEF](#MAX_PLACE_STEP_COEF) - [MAX_REPAIR_TIMING_ITER](#MAX_REPAIR_TIMING_ITER) - [MAX_ROUTING_LAYER](#MAX_ROUTING_LAYER) +- [MIN_PLACE_STEP_COEF](#MIN_PLACE_STEP_COEF) - [MIN_ROUTING_LAYER](#MIN_ROUTING_LAYER) - [PLACE_DENSITY](#PLACE_DENSITY) - [PLACE_DENSITY_LB_ADDON](#PLACE_DENSITY_LB_ADDON) @@ -470,9 +495,12 @@ configuration file. ## All stages variables +- [KEEP_VARS](#KEEP_VARS) +- [NUM_CORES](#NUM_CORES) - [OPENROAD_HIERARCHICAL](#OPENROAD_HIERARCHICAL) - [SWAP_ARITH_OPERATORS](#SWAP_ARITH_OPERATORS) - [SYNTH_WRAPPED_OPERATORS](#SYNTH_WRAPPED_OPERATORS) +- [WRITE_ODB_AND_SDC_EACH_STAGE](#WRITE_ODB_AND_SDC_EACH_STAGE) ## generate_abstract variables @@ -502,10 +530,10 @@ configuration file. - [FLOW_VARIANT](#FLOW_VARIANT) - [GDS_FILES](#GDS_FILES) - [GENERATE_ARTIFACTS_ON_FAILURE](#GENERATE_ARTIFACTS_ON_FAILURE) -- [GLOBAL_PLACEMENT_ARGS](#GLOBAL_PLACEMENT_ARGS) - [GUI_TIMING](#GUI_TIMING) - [IR_DROP_LAYER](#IR_DROP_LAYER) - [KLAYOUT_TECH_FILE](#KLAYOUT_TECH_FILE) +- [LAYER_PARASITICS_FILE](#LAYER_PARASITICS_FILE) - [LIB_FILES](#LIB_FILES) - [MACRO_EXTENSION](#MACRO_EXTENSION) - [PLATFORM](#PLATFORM) @@ -520,8 +548,6 @@ configuration file. - [SEAL_GDS](#SEAL_GDS) - [SET_RC_TCL](#SET_RC_TCL) - [SLEW_MARGIN](#SLEW_MARGIN) -- [SYNTH_ARGS](#SYNTH_ARGS) -- [SYNTH_HIER_SEPARATOR](#SYNTH_HIER_SEPARATOR) - [TAP_CELL_NAME](#TAP_CELL_NAME) - [TECH_LEF](#TECH_LEF) - [USE_FILL](#USE_FILL) diff --git a/docs/user/LargeDesigns.md b/docs/user/LargeDesigns.md new file mode 100644 index 0000000000..b3926905c8 --- /dev/null +++ b/docs/user/LargeDesigns.md @@ -0,0 +1,26 @@ +# Tips on building large design + +Large designs can quickly result in unmanageable turnaround times for tweaking and fixing if the design contains behavioral memory models, because these memories are by default translated to flip flops. + +ORFS has a `SYNTH_MEMORY_MAX_BITS` that limits the size of inferred memories that are translated to flip flops to avoid doomed synthesis runs that will "running forever", instead ORFS will error out early, normally within minutes. + +Behavioral models of memories are used in simulation and FPGA tools oftentimes automatically combine hard memory macros with some extra logic to match the behavioral model. OpenROAD does not do such automatic memory inference and matching against real memories or fakemem. + +## Doing a screening build + +Before deciding how to set up a flow, it is useful to do a "screening build". All we're intersted in here is to know which modules we have and their relative sizes. This can help us identify memories that have not been successfully inferred by Yosys, which will manifest itself as very long synthesis times and appear in the OpenROAD hierarchical view with a large number of instances. + +The [minimal build configuration](flow/designs/asap7/minimal/README.md) + can be useful to do a screening build. + +Options useful for a screening build are, check out [config.mk](flow/designs/asap7/minimal/config.mk): + +- `SYNTH_HIERARCHICAL=1` and `SYNTH_MINIMUM_KEEP_SIZE=0`, to see all modules in the hierarchical OpenROAD view +- `SYNTH_MEMORY_MAX_BITS=1024`, set a low threshold initially to get an error with list of memories in the system that will need to be dealt with in some way +- `SYNTH_MOCK_LARGE_MEMORIES=1` enabled after first seeing the error report with memories. This sets the number of rows in memories larger than `SYNTH_MEMORY_MAX_BITS` to 1, so that synthesis will complete. + +## Next steps on memories + +- If you're taping out, write some wrapper Verilog for real memories. +- fakemem can be a good option if available for your PDK. fakemem also needs manually written Verilog wrappers, just like real memories. +- For architectural exploration, `SYNTH_MOCK_LARGE_MEMORIES=1` could give you adequate timing accuracy and is convenient. diff --git a/env.sh b/env.sh index 563c003a81..9b4241cbf6 100755 --- a/env.sh +++ b/env.sh @@ -13,6 +13,7 @@ function __setpaths() { # developer settings go in ./dev_env.sh export PATH=${DIR}/tools/install/OpenROAD/bin:$PATH export PATH=${DIR}/tools/install/yosys/bin:$PATH + export PATH=${DIR}/tools/install/kepler-formal/bin:$PATH if [[ "$OSTYPE" == "darwin"* ]]; then export PATH="/Applications/KLayout/klayout.app/Contents/MacOS:$PATH" diff --git a/etc/DependencyInstaller.sh b/etc/DependencyInstaller.sh index 97975ed322..9e940ef858 100755 --- a/etc/DependencyInstaller.sh +++ b/etc/DependencyInstaller.sh @@ -11,7 +11,6 @@ fi # package versions klayoutVersion=0.30.3 -verilatorVersion=5.026 numThreads=$(nproc) _versionCompare() { @@ -38,34 +37,6 @@ _installPipCommon() { fi } -_installVerilator() { - local baseDir - if [[ "$constantBuildDir" == "true" ]]; then - baseDir="/tmp/DependencyInstaller-ORFS" - if [[ -d "$baseDir" ]]; then - echo "[INFO] Removing old building directory $baseDir" - fi - mkdir -p "$baseDir" - else - baseDir=$(mktemp -d /tmp/DependencyInstaller-orfs-XXXXXX) - fi - - # Install Verilator - verilatorPrefix=`realpath ${PREFIX:-"/usr/local"}` - if [[ ! -x ${verilatorPrefix}/bin/verilator ]]; then - pushd $baseDir - git clone --depth=1 -b "v$verilatorVersion" https://github.com/verilator/verilator.git - pushd verilator - autoconf - ./configure --prefix "${verilatorPrefix}" - make -j "${numThreads}" - make install - popd - rm -r verilator - popd - fi -} - # Enterprise Linux 7 cleanup _install_EL7_CleanUp() { yum clean -y all @@ -286,7 +257,7 @@ _installUbuntuPackages() { _installDarwinPackages() { brew install libffi tcl-tk ruby - brew install python libomp + brew install python libomp doxygen capnp tbb bison flex boost spdlog zlib brew link --force libomp brew install --cask klayout brew install docker docker-buildx @@ -300,7 +271,10 @@ _installCI() { coreutils \ curl \ python3 \ - software-properties-common + software-properties-common \ + clang pkg-config \ + libboost-dev libfl-dev libtbb-dev capnproto libcapnp-dev \ + libgtest-dev libspdlog-dev libfmt-dev libboost-iostreams-dev zlib1g-dev } _help() { @@ -472,7 +446,6 @@ case "${os}" in if [[ "${option}" == "common" || "${option}" == "all" ]]; then _installPipCommon - _installVerilator fi ;; "Ubuntu" | "Debian GNU/Linux rodete" ) @@ -494,7 +467,6 @@ case "${os}" in if _versionCompare ${version} -lt 23.04 ; then _installPipCommon fi - _installVerilator else echo "Skip common for rodete" fi @@ -510,7 +482,6 @@ case "${os}" in fi if [[ "${option}" == "common" || "${option}" == "all" ]]; then _installPipCommon - _installVerilator fi ;; *) diff --git a/flow/Makefile b/flow/Makefile index 6204b0674c..43d7eb60f6 100644 --- a/flow/Makefile +++ b/flow/Makefile @@ -227,7 +227,7 @@ $(WRAPPED_LIBS): # |____/ |_| |_| \_| |_| |_| |_|_____|____/___|____/ # .PHONY: synth -synth: $(RESULTS_DIR)/1_synth.v +synth: $(RESULTS_DIR)/1_synth.odb .PHONY: synth-report synth-report: synth @@ -260,6 +260,7 @@ yosys-dependencies: $(YOSYS_DEPENDENCIES) .PHONY: do-yosys do-yosys: yosys-dependencies $(SCRIPTS_DIR)/synth.sh $(SYNTH_SCRIPT) $(LOG_DIR)/1_2_yosys.log + cp $(SDC_FILE) $(RESULTS_DIR)/1_2_yosys.sdc .PHONY: do-yosys-canonicalize do-yosys-canonicalize: yosys-dependencies @@ -268,17 +269,8 @@ do-yosys-canonicalize: yosys-dependencies $(RESULTS_DIR)/1_1_yosys_canonicalize.rtlil: $(YOSYS_DEPENDENCIES) $(UNSET_AND_MAKE) do-yosys-canonicalize -$(RESULTS_DIR)/1_2_yosys.v: $(RESULTS_DIR)/1_1_yosys_canonicalize.rtlil +$(RESULTS_DIR)/1_2_yosys.v $(RESULTS_DIR)/1_2_yosys.sdc: $(RESULTS_DIR)/1_1_yosys_canonicalize.rtlil $(UNSET_AND_MAKE) do-yosys - -.PHONY: do-synth -do-synth: - mkdir -p $(RESULTS_DIR) $(LOG_DIR) $(REPORTS_DIR) - cp $(RESULTS_DIR)/1_2_yosys.v $(RESULTS_DIR)/1_synth.v - -$(RESULTS_DIR)/1_synth.v: $(RESULTS_DIR)/1_2_yosys.v - $(UNSET_AND_MAKE) do-synth - .PHONY: clean_synth clean_synth: rm -f $(RESULTS_DIR)/1_* $(RESULTS_DIR)/mem*.json @@ -395,23 +387,25 @@ endef # ============================================================================== # Custom target to go from synthesis to placement in a single OpenROAD run -$(eval $(call do-step,1_3_floorplan_to_place, $(RESULTS_DIR)/1_synth.v $(RESULTS_DIR)/1_synth.sdc,floorplan_to_place)) +$(eval $(call do-step,1_3_floorplan_to_place, $(RESULTS_DIR)/1_synth.odb $(RESULTS_DIR)/1_synth.sdc,floorplan_to_place)) .PHONY: floorplan_to_place -floorplan_to_place: $(RESULTS_DIR)/1_synth.v $(RESULTS_DIR)/1_synth.sdc +floorplan_to_place: $(RESULTS_DIR)/1_synth.odb $(RESULTS_DIR)/1_synth.sdc $(UNSET_AND_MAKE) do-1_3_floorplan_to_place # ============================================================================== -$(eval $(call do-step,1_3_synth,$(RESULTS_DIR)/1_synth.v $(RESULTS_DIR)/1_synth.sdc,synth_odb)) +$(eval $(call do-step,1_synth,$(RESULTS_DIR)/1_2_yosys.v $(RESULTS_DIR)/1_2_yosys.sdc $(TECH_LEF) $(SC_LEF) $(ADDITIONAL_LEFS) $(LIB_FILES),synth_odb)) + +$(RESULTS_DIR)/1_synth.sdc: $(RESULTS_DIR)/1_synth.odb -$(eval $(call do-step,2_1_floorplan,$(RESULTS_DIR)/1_synth.v $(RESULTS_DIR)/1_synth.sdc $(TECH_LEF) $(SC_LEF) $(ADDITIONAL_LEFS) $(FOOTPRINT) $(SIG_MAP_FILE) $(FOOTPRINT_TCL) $(LIB_FILES) $(IO_CONSTRAINTS),floorplan)) +$(eval $(call do-step,2_1_floorplan,$(RESULTS_DIR)/1_synth.odb $(RESULTS_DIR)/1_synth.sdc $(TECH_LEF) $(SC_LEF) $(ADDITIONAL_LEFS) $(FOOTPRINT) $(SIG_MAP_FILE) $(FOOTPRINT_TCL) $(LIB_FILES) $(IO_CONSTRAINTS),floorplan)) $(eval $(call do-copy,2_floorplan,2_1_floorplan.sdc,,.sdc)) # STEP 2: Macro Placement #------------------------------------------------------------------------------- -$(eval $(call do-step,2_2_floorplan_macro,$(RESULTS_DIR)/2_1_floorplan.odb $(RESULTS_DIR)/1_synth.v $(RESULTS_DIR)/1_synth.sdc $(MACRO_PLACEMENT) $(MACRO_PLACEMENT_TCL),macro_place)) +$(eval $(call do-step,2_2_floorplan_macro,$(RESULTS_DIR)/2_1_floorplan.odb $(RESULTS_DIR)/1_synth.sdc $(MACRO_PLACEMENT) $(MACRO_PLACEMENT_TCL),macro_place)) # STEP 3: Tapcell and Welltie insertion #------------------------------------------------------------------------------- diff --git a/flow/designs/asap7/aes-block/block.mk b/flow/designs/asap7/aes-block/block.mk index 7bc1fd2acc..841f0405bd 100644 --- a/flow/designs/asap7/aes-block/block.mk +++ b/flow/designs/asap7/aes-block/block.mk @@ -15,3 +15,4 @@ export MAX_ROUTING_LAYER ?= M5 export PLACE_PINS_ARGS = -annealing export PDN_TCL = $(PLATFORM_DIR)/openRoad/pdn/BLOCK_grid_strategy.tcl + diff --git a/flow/designs/asap7/aes-block/rules-base.json b/flow/designs/asap7/aes-block/rules-base.json index 4f12b227fb..8623bdac5f 100644 --- a/flow/designs/asap7/aes-block/rules-base.json +++ b/flow/designs/asap7/aes-block/rules-base.json @@ -1,101 +1,6 @@ { - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "cts__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "detailedplace__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:PDN-0110": { - "value": 43, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:PDN-0195": { - "value": 19, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:RSZ-0020": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { - "value": 2130.06, + "value": 2090.0, "compare": "<=" }, "constraints__clocks__count": { @@ -103,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 7216, + "value": 7210, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 10646, + "value": 10573, "compare": "<=" }, "detailedplace__design__violations": { @@ -115,19 +20,19 @@ "compare": "==" }, "cts__design__instance__count__setup_buffer": { - "value": 926, + "value": 919, "compare": "<=" }, "cts__design__instance__count__hold_buffer": { - "value": 1398, + "value": 1445, "compare": "<=" }, "cts__timing__setup__ws": { - "value": -160.0, + "value": -162.0, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -13300.0, + "value": -9000.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -143,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -146.0, + "value": -164.0, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -10500.0, + "value": -8520.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -159,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 55890, + "value": 52923, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -174,28 +79,12 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -22.5, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -90.0, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -22.5, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -90.0, - "compare": ">=" - }, "finish__timing__setup__ws": { - "value": -127.0, + "value": -129.0, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -8360.0, + "value": -3780.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/asap7/aes-mbff/rules-base.json b/flow/designs/asap7/aes-mbff/rules-base.json index 8d36181dd2..e74cce5db2 100644 --- a/flow/designs/asap7/aes-mbff/rules-base.json +++ b/flow/designs/asap7/aes-mbff/rules-base.json @@ -1,94 +1,4 @@ { - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "cts__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "detailedplace__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0075": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { "value": 1928.39, "compare": "<=" @@ -118,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -40.1, + "value": -38.2, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -749.0, + "value": -1130.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -138,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -51.5, + "value": -49.6, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -2430.0, + "value": -2470.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -169,28 +79,12 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -19.0, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -76.0, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -19.0, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -76.0, - "compare": ">=" - }, "finish__timing__setup__ws": { - "value": -41.5, + "value": -42.3, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -848.0, + "value": -986.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/asap7/aes/rules-base.json b/flow/designs/asap7/aes/rules-base.json index 7f4b87c4a3..130b1932c9 100644 --- a/flow/designs/asap7/aes/rules-base.json +++ b/flow/designs/asap7/aes/rules-base.json @@ -1,99 +1,4 @@ { - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "cts__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "detailedplace__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0075": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:PDN-1041": { - "value": 424, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { "value": 1928.39, "compare": "<=" @@ -103,7 +8,7 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 2177, + "value": 2162, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { @@ -123,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -43.9, + "value": -34.8, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -793.0, + "value": -1250.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -143,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -54.9, + "value": -47.4, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -2160.0, + "value": -2660.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -174,28 +79,12 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -19.0, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -76.0, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -19.0, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -76.0, - "compare": ">=" - }, "finish__timing__setup__ws": { - "value": -43.1, + "value": -44.3, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -693.0, + "value": -1100.0, "compare": ">=" }, "finish__timing__hold__ws": { @@ -207,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 2278, + "value": 2269, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/asap7/aes_lvt/rules-base.json b/flow/designs/asap7/aes_lvt/rules-base.json index df847fc63e..e5039648ab 100644 --- a/flow/designs/asap7/aes_lvt/rules-base.json +++ b/flow/designs/asap7/aes_lvt/rules-base.json @@ -1,84 +1,4 @@ { - "cts__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "detailedplace__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0075": { - "value": 3, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:PDN-1041": { - "value": 424, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { "value": 1920.63, "compare": "<=" @@ -88,7 +8,7 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 1987, + "value": 1978, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { @@ -144,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 69277, + "value": 68956, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -159,22 +79,6 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -18.0, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -72.0, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -18.0, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -72.0, - "compare": ">=" - }, "finish__timing__setup__ws": { "value": -18.0, "compare": ">=" @@ -192,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 2026, + "value": 2017, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/asap7/cva6/rules-base.json b/flow/designs/asap7/cva6/rules-base.json index 7da3b02522..6de4b33e01 100644 --- a/flow/designs/asap7/cva6/rules-base.json +++ b/flow/designs/asap7/cva6/rules-base.json @@ -1,109 +1,4 @@ { - "cts__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "detailedplace__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0075": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:STA-0366": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:STA-0473": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:GPL-0302": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:PDN-1041": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:GPL-0302": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { "value": 18784.414249, "compare": "<=" @@ -133,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -50.8, + "value": -50.0, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -201.0, + "value": -200.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -153,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -54.4, + "value": -50.0, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -254.0, + "value": -200.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -184,28 +79,12 @@ "value": 118, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -50.0, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -200.0, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -50.0, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -200.0, - "compare": ">=" - }, "finish__timing__setup__ws": { - "value": -56.3, + "value": -50.0, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -257.0, + "value": -200.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/asap7/ethmac/config.mk b/flow/designs/asap7/ethmac/config.mk index 8a056c207b..c7770d7137 100644 --- a/flow/designs/asap7/ethmac/config.mk +++ b/flow/designs/asap7/ethmac/config.mk @@ -6,7 +6,7 @@ export VERILOG_FILES = $(sort $(wildcard $(DESIGN_HOME)/src/$(DESIGN_NIC export SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint.sdc export ABC_AREA = 1 -export CORE_UTILIZATION = 60 +export CORE_UTILIZATION = 70 export CORE_ASPECT_RATIO = 1 export CORE_MARGIN = 2 export PLACE_DENSITY = 0.75 diff --git a/flow/designs/asap7/ethmac/rules-base.json b/flow/designs/asap7/ethmac/rules-base.json index 93515aa3e8..4830c0904e 100644 --- a/flow/designs/asap7/ethmac/rules-base.json +++ b/flow/designs/asap7/ethmac/rules-base.json @@ -1,104 +1,4 @@ { - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "cts__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "detailedplace__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0075": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:PDN-1041": { - "value": 424, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:FLW-0010": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { "value": 8450.0, "compare": "<=" @@ -108,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 8676, + "value": 8665, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 69601, + "value": 69423, "compare": "<=" }, "detailedplace__design__violations": { @@ -120,19 +20,19 @@ "compare": "==" }, "cts__design__instance__count__setup_buffer": { - "value": 6052, + "value": 6037, "compare": "<=" }, "cts__design__instance__count__hold_buffer": { - "value": 6052, + "value": 6037, "compare": "<=" }, "cts__timing__setup__ws": { - "value": -125.0, + "value": -156.0, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -2530.0, + "value": -2870.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -148,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -144.0, + "value": -174.0, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -3740.0, + "value": -3840.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -179,28 +79,12 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -91.0, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -1650.0, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -15.0, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -60.0, - "compare": ">=" - }, "finish__timing__setup__ws": { - "value": -127.0, + "value": -163.0, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -2599.45, + "value": -3180.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/asap7/ethmac_lvt/rules-base.json b/flow/designs/asap7/ethmac_lvt/rules-base.json index 6a381588d6..db9c06a286 100644 --- a/flow/designs/asap7/ethmac_lvt/rules-base.json +++ b/flow/designs/asap7/ethmac_lvt/rules-base.json @@ -1,114 +1,4 @@ { - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "cts__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "detailedplace__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:DRT-0120": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0075": { - "value": 788, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:PDN-1041": { - "value": 424, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0120": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:FLW-0010": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { "value": 8418.677166, "compare": "<=" @@ -138,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -38.4, + "value": -62.7, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -353.0, + "value": -951.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -158,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -46.6, + "value": -70.3, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -506.0, + "value": -1150.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -189,28 +79,12 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -15.0, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -60.0, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -15.0, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -60.0, - "compare": ">=" - }, "finish__timing__setup__ws": { - "value": -38.1, + "value": -56.5, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -343.0, + "value": -904.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/asap7/gcd-ccs/rules-base.json b/flow/designs/asap7/gcd-ccs/rules-base.json index 1a8ed5e6a3..102e04c4e8 100644 --- a/flow/designs/asap7/gcd-ccs/rules-base.json +++ b/flow/designs/asap7/gcd-ccs/rules-base.json @@ -1,94 +1,4 @@ { - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "cts__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "detailedplace__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0075": { - "value": 508, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:PDN-1041": { - "value": 424, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { "value": 43.1, "compare": "<=" @@ -102,7 +12,7 @@ "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 526, + "value": 520, "compare": "<=" }, "detailedplace__design__violations": { @@ -110,7 +20,7 @@ "compare": "==" }, "cts__design__instance__count__setup_buffer": { - "value": 46, + "value": 45, "compare": "<=" }, "cts__design__instance__count__hold_buffer": { @@ -118,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -39.4, + "value": -33.8, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -205.0, + "value": -103.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -138,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -38.9, + "value": -33.8, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -200.0, + "value": -102.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -154,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 1176, + "value": 1358, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -169,28 +79,12 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -38.9, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -200.0, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -15.5, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -62.0, - "compare": ">=" - }, "finish__timing__setup__ws": { - "value": -60.7, + "value": -56.6, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -684.0, + "value": -324.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/asap7/gcd/rules-base.json b/flow/designs/asap7/gcd/rules-base.json index 3c2f48b99a..5b577397e3 100644 --- a/flow/designs/asap7/gcd/rules-base.json +++ b/flow/designs/asap7/gcd/rules-base.json @@ -1,94 +1,4 @@ { - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "cts__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "detailedplace__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0075": { - "value": 508, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:PDN-1041": { - "value": 424, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { "value": 43.1, "compare": "<=" @@ -102,7 +12,7 @@ "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 538, + "value": 531, "compare": "<=" }, "detailedplace__design__violations": { @@ -114,15 +24,15 @@ "compare": "<=" }, "cts__design__instance__count__hold_buffer": { - "value": 47, + "value": 46, "compare": "<=" }, "cts__timing__setup__ws": { - "value": -69.3, + "value": -53.6, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -419.0, + "value": -281.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -138,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -78.2, + "value": -64.0, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -551.0, + "value": -439.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -154,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 1174, + "value": 1352, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -169,28 +79,12 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -54.0, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -236.0, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -15.5, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -62.0, - "compare": ">=" - }, "finish__timing__setup__ws": { - "value": -66.0, + "value": -48.6, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -402.0, + "value": -270.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/asap7/ibex/config.mk b/flow/designs/asap7/ibex/config.mk index 170af31035..8a1c644f23 100644 --- a/flow/designs/asap7/ibex/config.mk +++ b/flow/designs/asap7/ibex/config.mk @@ -28,3 +28,5 @@ export ENABLE_DPO = 0 export TNS_END_PERCENT = 100 +export SWAP_ARITH_OPERATORS = 1 +export OPENROAD_HIERARCHICAL = 1 diff --git a/flow/designs/asap7/ibex/rules-base.json b/flow/designs/asap7/ibex/rules-base.json index 7862350d54..b3d7ced325 100644 --- a/flow/designs/asap7/ibex/rules-base.json +++ b/flow/designs/asap7/ibex/rules-base.json @@ -1,101 +1,6 @@ { - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "cts__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "detailedplace__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0075": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:PDN-1041": { - "value": 424, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { - "value": 2612.69, + "value": 2440.0, "compare": "<=" }, "constraints__clocks__count": { @@ -103,7 +8,7 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 2781, + "value": 2745, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { @@ -123,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -213.0, + "value": -139.0, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -94400.0, + "value": -35900.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -143,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -214.0, + "value": -151.0, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -99700.0, + "value": -57400.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -174,28 +79,12 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -50.0, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -200.0, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -50.0, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -200.0, - "compare": ">=" - }, "finish__timing__setup__ws": { - "value": -193.0, + "value": -125.0, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -53400.0, + "value": -34700.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/asap7/jpeg/rules-base.json b/flow/designs/asap7/jpeg/rules-base.json index 410c5a7ec2..bbcd2221de 100644 --- a/flow/designs/asap7/jpeg/rules-base.json +++ b/flow/designs/asap7/jpeg/rules-base.json @@ -1,89 +1,4 @@ { - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "cts__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "detailedplace__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0075": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { "value": 7008.24, "compare": "<=" @@ -113,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -50.8, + "value": -34.0, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -153.0, + "value": -136.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -133,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -36.3, + "value": -34.0, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -153.0, + "value": -136.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -164,22 +79,6 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -34.0, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -136.0, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -34.0, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -136.0, - "compare": ">=" - }, "finish__timing__setup__ws": { "value": -34.0, "compare": ">=" diff --git a/flow/designs/asap7/jpeg_lvt/rules-base.json b/flow/designs/asap7/jpeg_lvt/rules-base.json index fd18f817d5..5304309a43 100644 --- a/flow/designs/asap7/jpeg_lvt/rules-base.json +++ b/flow/designs/asap7/jpeg_lvt/rules-base.json @@ -1,99 +1,4 @@ { - "cts__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "detailedplace__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:DRT-0120": { - "value": 3, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0075": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:PDN-1041": { - "value": 424, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0120": { - "value": 3, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { "value": 7047.572508, "compare": "<=" @@ -174,22 +79,6 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -30.0, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -120.0, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -30.0, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -120.0, - "compare": ">=" - }, "finish__timing__setup__ws": { "value": -30.0, "compare": ">=" diff --git a/flow/designs/asap7/minimal/config.mk b/flow/designs/asap7/minimal/config.mk index ce53e6c2aa..acc8d8fc1a 100644 --- a/flow/designs/asap7/minimal/config.mk +++ b/flow/designs/asap7/minimal/config.mk @@ -1,5 +1,5 @@ export DESIGN_NICKNAME = minimal -export SDC_FILE = $(FLOW_HOME)/designs/asap7/minimal/empty.sdc +export SDC_FILE ?= $(FLOW_HOME)/designs/asap7/minimal/empty.sdc export PLATFORM = asap7 # Faster build and more information in GUI with hierarchical synthesis export SYNTH_HIERARCHICAL ?= 1 @@ -15,9 +15,11 @@ export CORE_UTILIZATION ?= 10 export PLACE_DENSITY ?= 0.20 # This won't work with an empty .sdc file -export SKIP_REPORT_METRICS = 1 +export SKIP_REPORT_METRICS ?= 1 # Faster build, remove these in your own config.mk -export SKIP_CTS_REPAIR_TIMING = 1 -export REMOVE_ABC_BUFFERS = 1 -export SKIP_INCREMENTAL_REPAIR = 1 +export SKIP_CTS_REPAIR_TIMING ?= 1 +export REMOVE_ABC_BUFFERS ?= 1 +export SKIP_INCREMENTAL_REPAIR ?= 1 +export GPL_TIMING_DRIVEN ?= 0 +export GPL_ROUTING_DRIVEN ?= 0 diff --git a/flow/designs/asap7/mock-alu/config.mk b/flow/designs/asap7/mock-alu/config.mk index 434bbc0065..8dedca1632 100644 --- a/flow/designs/asap7/mock-alu/config.mk +++ b/flow/designs/asap7/mock-alu/config.mk @@ -7,3 +7,6 @@ export CORE_UTILIZATION = 50 export CORNER = BC export ROUTING_LAYER_ADJUSTMENT = 0.45 + +export SWAP_ARITH_OPERATORS = 1 +export OPENROAD_HIERARCHICAL = 1 diff --git a/flow/designs/asap7/mock-alu/rules-base.json b/flow/designs/asap7/mock-alu/rules-base.json index 8e66545cb5..b2a7eeaa9f 100644 --- a/flow/designs/asap7/mock-alu/rules-base.json +++ b/flow/designs/asap7/mock-alu/rules-base.json @@ -1,101 +1,6 @@ { - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "cts__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "detailedplace__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0075": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:PDN-1041": { - "value": 424, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { - "value": 1665.04, + "value": 1640.0, "compare": "<=" }, "constraints__clocks__count": { @@ -103,7 +8,7 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 1816, + "value": 1808, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { @@ -127,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -19200.0, + "value": -17700.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -143,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -310.0, + "value": -295.0, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -23300.0, + "value": -20200.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -174,28 +79,12 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -255.0, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -14900.0, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -15.0, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -60.0, - "compare": ">=" - }, "finish__timing__setup__ws": { - "value": -297.0, + "value": -271.0, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -20500.0, + "value": -17200.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/asap7/mock-cpu/rules-base.json b/flow/designs/asap7/mock-cpu/rules-base.json index e97ac72424..fa1aefe3a0 100644 --- a/flow/designs/asap7/mock-cpu/rules-base.json +++ b/flow/designs/asap7/mock-cpu/rules-base.json @@ -1,194 +1,4 @@ { - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "cts__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "cts__flow__warnings__count:STA-1551": { - "value": 2, - "compare": "<=", - "level": "warning" - }, - "cts__flow__warnings__count:STA-1554": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "detailedplace__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "detailedplace__flow__warnings__count:STA-1551": { - "value": 2, - "compare": "<=", - "level": "warning" - }, - "detailedplace__flow__warnings__count:STA-1554": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:STA-1551": { - "value": 2, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:STA-1554": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:STA-1551": { - "value": 2, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:STA-1554": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0075": { - "value": 696, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:STA-1551": { - "value": 2, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:STA-1554": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:PDN-1041": { - "value": 424, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:STA-1551": { - "value": 2, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:STA-1554": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:STA-1551": { - "value": 2, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:STA-1554": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:FLW-0010": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:STA-1551": { - "value": 2, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:STA-1554": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:STA-1551": { - "value": 2, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:STA-1554": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { "value": 7302.54, "compare": "<=" @@ -222,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -3130.0, + "value": -2070.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -238,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -109.0, + "value": -104.0, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -3830.0, + "value": -2350.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -269,28 +79,12 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -97.5, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -2630.0, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -16.6, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -66.6, - "compare": ">=" - }, "finish__timing__setup__ws": { - "value": -103.0, + "value": -97.7, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -3620.0, + "value": -2230.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/asap7/riscv32i-mock-sram/rules-base.json b/flow/designs/asap7/riscv32i-mock-sram/rules-base.json index 7ee997a952..b0a71d4efa 100644 --- a/flow/designs/asap7/riscv32i-mock-sram/rules-base.json +++ b/flow/designs/asap7/riscv32i-mock-sram/rules-base.json @@ -1,94 +1,4 @@ { - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "cts__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "detailedplace__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:PDN-0110": { - "value": 3, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:RSZ-0020": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { "value": 1640.0, "compare": "<=" @@ -118,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -109.0, + "value": -50.0, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -577.0, + "value": -200.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -138,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -117.0, + "value": -51.5, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -540.0, + "value": -202.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -154,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 73967, + "value": 84714, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -169,28 +79,12 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -50.0, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -200.0, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -50.0, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -200.0, - "compare": ">=" - }, "finish__timing__setup__ws": { - "value": -109.0, + "value": -50.0, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -1870.0, + "value": -200.0, "compare": ">=" }, "finish__timing__hold__ws": { @@ -202,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 2277, + "value": 2270, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/asap7/riscv32i/config.mk b/flow/designs/asap7/riscv32i/config.mk index 60313250f5..693473f65e 100644 --- a/flow/designs/asap7/riscv32i/config.mk +++ b/flow/designs/asap7/riscv32i/config.mk @@ -26,3 +26,6 @@ export TNS_END_PERCENT = 100 export CTS_CLUSTER_SIZE = 10 export CTS_CLUSTER_DIAMETER = 50 + +export SWAP_ARITH_OPERATORS = 1 +export OPENROAD_HIERARCHICAL = 1 diff --git a/flow/designs/asap7/riscv32i/rules-base.json b/flow/designs/asap7/riscv32i/rules-base.json index 0e59537c0a..ae37e5c315 100644 --- a/flow/designs/asap7/riscv32i/rules-base.json +++ b/flow/designs/asap7/riscv32i/rules-base.json @@ -1,96 +1,6 @@ { - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "cts__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "detailedplace__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0075": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { - "value": 2908.684535, + "value": 2830.0, "compare": "<=" }, "constraints__clocks__count": { @@ -118,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -86.2, + "value": -50.0, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -313.0, + "value": -200.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -138,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -83.9, + "value": -50.0, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -17300.0, + "value": -200.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -154,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 74871, + "value": 74215, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -169,28 +79,12 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -50.0, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -200.0, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -50.0, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -200.0, - "compare": ">=" - }, "finish__timing__setup__ws": { - "value": -119.0, + "value": -50.0, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -25000.0, + "value": -200.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/asap7/swerv_wrapper/config.mk b/flow/designs/asap7/swerv_wrapper/config.mk index 2a22c2dde9..1356b5d586 100644 --- a/flow/designs/asap7/swerv_wrapper/config.mk +++ b/flow/designs/asap7/swerv_wrapper/config.mk @@ -58,3 +58,6 @@ export IO_CONSTRAINTS = $(DESIGN_HOME)/$(PLATFORM)/swerv_wrapper/io.tcl export PLACE_DENSITY_LB_ADDON = 0.20 export ROUTING_LAYER_ADJUSTMENT = 0.2 + +export SWAP_ARITH_OPERATORS = 1 +export OPENROAD_HIERARCHICAL = 1 diff --git a/flow/designs/asap7/swerv_wrapper/rules-base.json b/flow/designs/asap7/swerv_wrapper/rules-base.json index cc3ca2ee86..7e95b63643 100644 --- a/flow/designs/asap7/swerv_wrapper/rules-base.json +++ b/flow/designs/asap7/swerv_wrapper/rules-base.json @@ -1,81 +1,6 @@ { - "cts__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "detailedplace__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { - "value": 53459.06, + "value": 52700.0, "compare": "<=" }, "constraints__clocks__count": { @@ -83,7 +8,7 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 55898, + "value": 55798, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { @@ -139,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 1610613, + "value": 1585423, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -154,36 +79,20 @@ "value": 118, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -80.0, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -320.0, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -80.0, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -320.0, - "compare": ">=" - }, "finish__timing__setup__ws": { - "value": -441.0, + "value": -268.0, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -223000.0, + "value": -80300.0, "compare": ">=" }, "finish__timing__hold__ws": { - "value": -285.0, + "value": -377.0, "compare": ">=" }, "finish__timing__hold__tns": { - "value": -86400.0, + "value": -104000.0, "compare": ">=" }, "finish__design__instance__area": { diff --git a/flow/designs/asap7/uart/config.mk b/flow/designs/asap7/uart/config.mk index 05de91bcbb..4ff340d770 100644 --- a/flow/designs/asap7/uart/config.mk +++ b/flow/designs/asap7/uart/config.mk @@ -5,6 +5,9 @@ export DESIGN_NAME = uart export VERILOG_FILES = $(sort $(wildcard $(DESIGN_HOME)/src/$(DESIGN_NICKNAME)/*.v)) export SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint.sdc +# Smoke test for the option; doesn't do anything as the named +# module does not exist +export SYNTH_BLACKBOXES = dummy export PLACE_DENSITY = 0.70 export DIE_AREA = 0 0 17 17 @@ -13,4 +16,5 @@ export TNS_END_PERCENT = 100 export EQUIVALENCE_CHECK ?= 1 export REMOVE_CELLS_FOR_EQY = TAPCELL* export SKIP_GATE_CLONING = 1 -export VERILOG_TOP_PARAMS = DATA_WIDTH 8 +export VERILOG_TOP_PARAMS = DATA_WIDTH 8 +export SYNTH_HDL_FRONTEND = slang diff --git a/flow/designs/asap7/uart/rules-base.json b/flow/designs/asap7/uart/rules-base.json index bea3214abc..2d249c9335 100644 --- a/flow/designs/asap7/uart/rules-base.json +++ b/flow/designs/asap7/uart/rules-base.json @@ -1,91 +1,6 @@ { - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "cts__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "detailedplace__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0075": { - "value": 795, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:STA-1212": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { - "value": 83.24, + "value": 82.7, "compare": "<=" }, "constraints__clocks__count": { @@ -93,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 110, + "value": 100, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 1004, + "value": 912, "compare": "<=" }, "detailedplace__design__violations": { @@ -113,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -33.8, + "value": -36.3, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -556.0, + "value": -928.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -133,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -42.8, + "value": -48.7, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -1170.0, + "value": -1640.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -149,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 1754, + "value": 2030, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -164,28 +79,12 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -18.8, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -98.6, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -13.5, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -54.0, - "compare": ">=" - }, "finish__timing__setup__ws": { - "value": -34.3, + "value": -37.8, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -658.0, + "value": -1030.0, "compare": ">=" }, "finish__timing__hold__ws": { @@ -197,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 103, + "value": 119, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/gf12/aes/rules-base.json b/flow/designs/gf12/aes/rules-base.json index a70faa0c3e..300288c9d1 100644 --- a/flow/designs/gf12/aes/rules-base.json +++ b/flow/designs/gf12/aes/rules-base.json @@ -1,66 +1,6 @@ { - "detailedroute__flow__warnings__count:DRT-0142": { - "value": 5, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0254": { - "value": 3, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0256": { - "value": 5, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0260": { - "value": 2, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:PDN-1031": { - "value": 2, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0014": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0015": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0016": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0017": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0142": { - "value": 5, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { - "value": 3732.67, + "value": 3710.0, "compare": "<=" }, "constraints__clocks__count": { @@ -68,7 +8,7 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 4194, + "value": 4159, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { @@ -139,22 +79,6 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -21.0, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -84.0, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -21.0, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -84.0, - "compare": ">=" - }, "finish__timing__setup__ws": { "value": -21.0, "compare": ">=" @@ -172,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 4273, + "value": 4236, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/gf12/ariane/rules-base.json b/flow/designs/gf12/ariane/rules-base.json index 8bb5c35f3d..9f3daf7a8b 100644 --- a/flow/designs/gf12/ariane/rules-base.json +++ b/flow/designs/gf12/ariane/rules-base.json @@ -1,99 +1,4 @@ { - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:DRT-0120": { - "value": 23, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:DRT-0142": { - "value": 5, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0186": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0254": { - "value": 3, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0256": { - "value": 5, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0260": { - "value": 2, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:PDN-1031": { - "value": 2, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0014": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0015": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0016": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0017": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:GPL-0998": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:GPL-0999": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0120": { - "value": 23, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0142": { - "value": 5, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:RSZ-0095": { - "value": 1, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { "value": 193105.1, "compare": "<=" @@ -103,7 +8,7 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 214773, + "value": 214621, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { @@ -123,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -208.0, + "value": -211.0, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -715.0, + "value": -720.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -143,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -210.0, + "value": -208.0, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -717.0, + "value": -716.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -159,11 +64,11 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 3507181, + "value": 3427852, "compare": "<=" }, "detailedroute__route__drc_errors": { - "value": 2, + "value": 0, "compare": "<=" }, "detailedroute__antenna__violating__nets": { @@ -174,22 +79,6 @@ "value": 180, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -202.0, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -701.0, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -150.0, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -600.0, - "compare": ">=" - }, "finish__timing__setup__ws": { "value": -206.0, "compare": ">=" @@ -207,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 217050, + "value": 216957, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/gf12/ariane133/rules-base.json b/flow/designs/gf12/ariane133/rules-base.json index d145cc4420..954628dc2c 100644 --- a/flow/designs/gf12/ariane133/rules-base.json +++ b/flow/designs/gf12/ariane133/rules-base.json @@ -79,22 +79,6 @@ "value": 5, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": 0.0, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": 0.0, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": 0.0, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": 0.0, - "compare": ">=" - }, "finish__timing__setup__ws": { "value": 0.0, "compare": ">=" @@ -119,4 +103,4 @@ "value": -10.0, "compare": ">=" } -} \ No newline at end of file +} diff --git a/flow/designs/gf12/bp_dual/rules-base.json b/flow/designs/gf12/bp_dual/rules-base.json index ab5e433780..08ba233a67 100644 --- a/flow/designs/gf12/bp_dual/rules-base.json +++ b/flow/designs/gf12/bp_dual/rules-base.json @@ -1,159 +1,14 @@ { - "cts__flow__warnings__count:CTS-0041": { - "value": 21, - "compare": "<=", - "level": "warning" - }, - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "cts__flow__warnings__count:STA-1551": { - "value": 40, - "compare": "<=", - "level": "warning" - }, - "detailedplace__flow__warnings__count:STA-1551": { - "value": 40, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:DRT-0120": { - "value": 54, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:DRT-0142": { - "value": 5, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:STA-1551": { - "value": 40, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:STA-1551": { - "value": 40, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0254": { - "value": 3, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0256": { - "value": 5, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0260": { - "value": 2, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:STA-1551": { - "value": 40, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:PDN-0110": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:PDN-0231": { - "value": 8, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:PDN-1031": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:STA-1551": { - "value": 40, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0014": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0015": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0016": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0017": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:STA-1551": { - "value": 40, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0120": { - "value": 54, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0142": { - "value": 5, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:FLW-0010": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:STA-1551": { - "value": 40, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:RSZ-0095": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:STA-1551": { - "value": 40, - "compare": "<=", - "level": "warning" - }, "constraints__clocks__count": { "value": 8, "compare": "==" }, "placeopt__design__instance__area": { - "value": 836829, + "value": 835155, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 908653, + "value": 902982, "compare": "<=" }, "detailedplace__design__violations": { @@ -161,27 +16,27 @@ "compare": "==" }, "cts__design__instance__count__setup_buffer": { - "value": 79013, + "value": 78520, "compare": "<=" }, "cts__design__instance__count__hold_buffer": { - "value": 79013, + "value": 78520, "compare": "<=" }, "cts__timing__setup__ws": { - "value": -193.0, + "value": -100.0, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -4660.0, + "value": -400.0, "compare": ">=" }, "cts__timing__hold__ws": { - "value": 0.0, + "value": -100.0, "compare": ">=" }, "cts__timing__hold__tns": { - "value": 0.0, + "value": -400.0, "compare": ">=" }, "globalroute__antenna_diodes_count": { @@ -197,15 +52,15 @@ "compare": ">=" }, "globalroute__timing__hold__ws": { - "value": -2.0547, + "value": -100.0, "compare": ">=" }, "globalroute__timing__hold__tns": { - "value": -2.0547, + "value": -400.0, "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 12984371, + "value": 13738224, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -220,28 +75,12 @@ "value": 5, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -307.0, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -2500.0, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -47.5581, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -2850.0, - "compare": ">=" - }, "finish__timing__setup__ws": { - "value": -216.79, + "value": -165.0, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -1441.656, + "value": -1440.0, "compare": ">=" }, "finish__timing__hold__ws": { @@ -249,11 +88,11 @@ "compare": ">=" }, "finish__timing__hold__tns": { - "value": -443.0, + "value": -400.0, "compare": ">=" }, "finish__design__instance__area": { - "value": 851537, + "value": 849384, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/gf12/bp_quad/rules-base.json b/flow/designs/gf12/bp_quad/rules-base.json index 4fe8d184e1..9f06523d88 100644 --- a/flow/designs/gf12/bp_quad/rules-base.json +++ b/flow/designs/gf12/bp_quad/rules-base.json @@ -4,7 +4,7 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 1579306, + "value": 1496173, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { @@ -23,16 +23,48 @@ "value": 125423, "compare": "<=" }, + "cts__timing__setup__ws": { + "value": -572.0, + "compare": ">=" + }, + "cts__timing__setup__tns": { + "value": -659000.0, + "compare": ">=" + }, + "cts__timing__hold__ws": { + "value": -100.0, + "compare": ">=" + }, + "cts__timing__hold__tns": { + "value": -400.0, + "compare": ">=" + }, "globalroute__antenna_diodes_count": { "value": 0, "compare": "<=" }, + "globalroute__timing__setup__ws": { + "value": -117.0, + "compare": ">=" + }, + "globalroute__timing__setup__tns": { + "value": -448.0, + "compare": ">=" + }, + "globalroute__timing__hold__ws": { + "value": -100.0, + "compare": ">=" + }, + "globalroute__timing__hold__tns": { + "value": -400.0, + "compare": ">=" + }, "detailedroute__route__wirelength": { - "value": 25903866, + "value": 24629256, "compare": "<=" }, "detailedroute__route__drc_errors": { - "value": 3, + "value": 0, "compare": "<=" }, "detailedroute__antenna__violating__nets": { @@ -44,23 +76,23 @@ "compare": "<=" }, "finish__timing__setup__ws": { - "value": -239.22, + "value": -201.0, "compare": ">=" }, - "finish__design__instance__area": { - "value": 1610080, - "compare": "<=" - }, - "finish__timing__drv__setup_violation_count": { - "value": 62711, - "compare": "<=" + "finish__timing__setup__tns": { + "value": -1330.0, + "compare": ">=" }, - "finish__timing__drv__hold_violation_count": { - "value": 170, - "compare": "<=" + "finish__timing__hold__ws": { + "value": -100.0, + "compare": ">=" }, - "finish__timing__wns_percent_delay": { - "value": -10.96, + "finish__timing__hold__tns": { + "value": -400.0, "compare": ">=" + }, + "finish__design__instance__area": { + "value": 1523750, + "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/gf12/bp_single/rules-base.json b/flow/designs/gf12/bp_single/rules-base.json index a910d71ac4..b6dff8a62b 100644 --- a/flow/designs/gf12/bp_single/rules-base.json +++ b/flow/designs/gf12/bp_single/rules-base.json @@ -1,179 +1,4 @@ { - "cts__flow__warnings__count:CTS-0041": { - "value": 21, - "compare": "<=", - "level": "warning" - }, - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "cts__flow__warnings__count:STA-1551": { - "value": 40, - "compare": "<=", - "level": "warning" - }, - "detailedplace__flow__warnings__count:STA-1551": { - "value": 40, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:DRT-0120": { - "value": 4, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:DRT-0142": { - "value": 5, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:STA-1551": { - "value": 40, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:STA-1551": { - "value": 40, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0254": { - "value": 3, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0256": { - "value": 5, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0260": { - "value": 2, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:STA-1551": { - "value": 40, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:PDN-0110": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:PDN-0195": { - "value": 25, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:PDN-0231": { - "value": 8, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:PDN-1031": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:STA-1551": { - "value": 40, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0014": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0015": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0016": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0017": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:GRT-0115": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:GRT-0704": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:STA-1551": { - "value": 40, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0120": { - "value": 4, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0142": { - "value": 5, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:FLW-0010": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0066": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:STA-1551": { - "value": 40, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:RSZ-0095": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:STA-1551": { - "value": 40, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { "value": 1020000.0, "compare": "<=" @@ -183,7 +8,7 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 472038, + "value": 471924, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { @@ -211,11 +36,11 @@ "compare": ">=" }, "cts__timing__hold__ws": { - "value": -100.0, + "value": -306.0, "compare": ">=" }, "cts__timing__hold__tns": { - "value": -400.0, + "value": -4360.0, "compare": ">=" }, "globalroute__antenna_diodes_count": { @@ -231,11 +56,11 @@ "compare": ">=" }, "globalroute__timing__hold__ws": { - "value": -117.0, + "value": -187.0, "compare": ">=" }, "globalroute__timing__hold__tns": { - "value": -1280.0, + "value": -2360.0, "compare": ">=" }, "detailedroute__route__wirelength": { @@ -254,28 +79,12 @@ "value": 333, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -166.0, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -675.0, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -120.0, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -10700.0, - "compare": ">=" - }, "finish__timing__setup__ws": { - "value": -130.0, + "value": -109.0, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -434.0, + "value": -507.0, "compare": ">=" }, "finish__timing__hold__ws": { @@ -287,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 480134, + "value": 479804, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/gf12/ca53/rules-base.json b/flow/designs/gf12/ca53/rules-base.json index 5072be0104..5f715384cf 100644 --- a/flow/designs/gf12/ca53/rules-base.json +++ b/flow/designs/gf12/ca53/rules-base.json @@ -1,89 +1,4 @@ { - "detailedroute__flow__warnings__count:DRT-0120": { - "value": 65, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:DRT-0142": { - "value": 5, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0186": { - "value": 8, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0254": { - "value": 3, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0256": { - "value": 5, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0260": { - "value": 2, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:STA-0345": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:PDN-1031": { - "value": 2, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0014": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0015": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0016": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0017": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0120": { - "value": 65, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0142": { - "value": 5, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:RSZ-0020": { - "value": 1, - "compare": "<=", - "level": "warning" - }, "constraints__clocks__count": { "value": 1, "compare": "==" @@ -113,7 +28,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -100.0, + "value": -400.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -121,7 +36,7 @@ "compare": ">=" }, "cts__timing__hold__tns": { - "value": -100.0, + "value": -400.0, "compare": ">=" }, "globalroute__antenna_diodes_count": { @@ -133,7 +48,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -100.0, + "value": -400.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -141,7 +56,7 @@ "compare": ">=" }, "globalroute__timing__hold__tns": { - "value": -1410.0, + "value": -793.0, "compare": ">=" }, "detailedroute__route__wirelength": { @@ -160,28 +75,12 @@ "value": 528, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -100.0, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -100.0, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -241.0, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -102000.0, - "compare": ">=" - }, "finish__timing__setup__ws": { "value": -100.0, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -100.0, + "value": -400.0, "compare": ">=" }, "finish__timing__hold__ws": { @@ -189,7 +88,7 @@ "compare": ">=" }, "finish__timing__hold__tns": { - "value": -4850.0, + "value": -3590.0, "compare": ">=" }, "finish__design__instance__area": { diff --git a/flow/designs/gf12/coyote/rules-base.json b/flow/designs/gf12/coyote/rules-base.json index 823c6631d0..85ff6a26f9 100644 --- a/flow/designs/gf12/coyote/rules-base.json +++ b/flow/designs/gf12/coyote/rules-base.json @@ -1,74 +1,4 @@ { - "detailedroute__flow__warnings__count:DRT-0142": { - "value": 5, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0254": { - "value": 3, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0256": { - "value": 5, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0260": { - "value": 2, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:PDN-0110": { - "value": 196, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:PDN-1031": { - "value": 2, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0014": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0015": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0016": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0017": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0142": { - "value": 5, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:RSZ-0095": { - "value": 1, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { "value": 172000.0, "compare": "<=" @@ -78,7 +8,7 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 198400, + "value": 197211, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { @@ -98,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -207.0, + "value": -200.0, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -807.0, + "value": -800.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -114,7 +44,7 @@ "compare": ">=" }, "globalroute__antenna_diodes_count": { - "value": 336, + "value": 332, "compare": "<=" }, "globalroute__timing__setup__ws": { @@ -146,25 +76,9 @@ "compare": "<=" }, "detailedroute__antenna_diodes_count": { - "value": 336, + "value": 333, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -200.0, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -800.0, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -239.0, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -10400.0, - "compare": ">=" - }, "finish__timing__setup__ws": { "value": -200.0, "compare": ">=" @@ -182,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 202906, + "value": 201687, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/gf12/gcd/rules-base.json b/flow/designs/gf12/gcd/rules-base.json index 73984d3538..a8115e9696 100644 --- a/flow/designs/gf12/gcd/rules-base.json +++ b/flow/designs/gf12/gcd/rules-base.json @@ -1,79 +1,4 @@ { - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:DRT-0142": { - "value": 5, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0254": { - "value": 3, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0256": { - "value": 5, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0260": { - "value": 2, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0075": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:PDN-1031": { - "value": 2, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0014": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0015": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0016": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0017": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0142": { - "value": 5, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { "value": 134.0, "compare": "<=" @@ -103,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -36.9, + "value": -46.3, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -313, + "value": -249.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -123,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -47.0, + "value": -54.9, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -357, + "value": -421.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -154,28 +79,12 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -14.0, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -22.8, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -14.0, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -14.0, - "compare": ">=" - }, "finish__timing__setup__ws": { - "value": -29.0, + "value": -38.5, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -161, + "value": -170.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/gf12/ibex/rules-base.json b/flow/designs/gf12/ibex/rules-base.json index 1a32ce6fdf..3b63acb1a4 100644 --- a/flow/designs/gf12/ibex/rules-base.json +++ b/flow/designs/gf12/ibex/rules-base.json @@ -1,74 +1,4 @@ { - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:DRT-0142": { - "value": 5, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0254": { - "value": 3, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0256": { - "value": 5, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0260": { - "value": 2, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:PDN-1031": { - "value": 2, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0014": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0015": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0016": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0017": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0142": { - "value": 5, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { "value": 6241.99, "compare": "<=" @@ -98,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -114.0, + "value": -51.0, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -1310.0, + "value": -204.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -118,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -66.4, + "value": -51.0, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -271.0, + "value": -204.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -134,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 161696, + "value": 160478, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -149,22 +79,6 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -51.0, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -204.0, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -51.0, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -204.0, - "compare": ">=" - }, "finish__timing__setup__ws": { "value": -51.0, "compare": ">=" @@ -182,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 7960, + "value": 7871, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/gf12/jpeg/rules-base.json b/flow/designs/gf12/jpeg/rules-base.json index b364b5e73b..e8303fd1b0 100644 --- a/flow/designs/gf12/jpeg/rules-base.json +++ b/flow/designs/gf12/jpeg/rules-base.json @@ -1,74 +1,4 @@ { - "detailedroute__flow__warnings__count:DRT-0120": { - "value": 2, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:DRT-0142": { - "value": 5, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0254": { - "value": 3, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0256": { - "value": 5, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0260": { - "value": 2, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:PDN-1031": { - "value": 2, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0014": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0015": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0016": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0017": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0120": { - "value": 2, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0142": { - "value": 5, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { "value": 20440.28, "compare": "<=" @@ -149,22 +79,6 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -38.5, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -154.0, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -38.5, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -154.0, - "compare": ">=" - }, "finish__timing__setup__ws": { "value": -38.5, "compare": ">=" diff --git a/flow/designs/gf12/swerv_wrapper/rules-base.json b/flow/designs/gf12/swerv_wrapper/rules-base.json index dc48ffae02..63b42752d6 100644 --- a/flow/designs/gf12/swerv_wrapper/rules-base.json +++ b/flow/designs/gf12/swerv_wrapper/rules-base.json @@ -1,89 +1,4 @@ { - "cts__flow__warnings__count:CTS-0041": { - "value": 5, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:DRT-0120": { - "value": 3, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:DRT-0142": { - "value": 5, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0011": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0254": { - "value": 3, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0256": { - "value": 5, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0260": { - "value": 2, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:PDN-1031": { - "value": 2, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0014": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0015": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0016": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0017": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0120": { - "value": 3, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0142": { - "value": 5, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:FLW-0010": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:RSZ-0095": { - "value": 1, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { "value": 156883.93, "compare": "<=" @@ -93,7 +8,7 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 173331, + "value": 173119, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { @@ -113,23 +28,23 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -75.0, + "value": -172.0, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -300.0, + "value": -899.0, "compare": ">=" }, "cts__timing__hold__ws": { - "value": -75.0, + "value": -108.0, "compare": ">=" }, "cts__timing__hold__tns": { - "value": -300.0, + "value": -370.0, "compare": ">=" }, "globalroute__antenna_diodes_count": { - "value": 108, + "value": 107, "compare": "<=" }, "globalroute__timing__setup__ws": { @@ -149,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 2311628, + "value": 2369199, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -161,25 +76,9 @@ "compare": "<=" }, "detailedroute__antenna_diodes_count": { - "value": 108, + "value": 107, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -75.0, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -300.0, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -120.0, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -53200.0, - "compare": ">=" - }, "finish__timing__setup__ws": { "value": -75.0, "compare": ">=" @@ -189,15 +88,15 @@ "compare": ">=" }, "finish__timing__hold__ws": { - "value": -85.2, + "value": -84.1, "compare": ">=" }, "finish__timing__hold__tns": { - "value": -765.0, + "value": -508.0, "compare": ">=" }, "finish__design__instance__area": { - "value": 177926, + "value": 177792, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/gf12/tinyRocket/rules-base.json b/flow/designs/gf12/tinyRocket/rules-base.json index ab08c7504d..ca3c09a855 100644 --- a/flow/designs/gf12/tinyRocket/rules-base.json +++ b/flow/designs/gf12/tinyRocket/rules-base.json @@ -1,69 +1,4 @@ { - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:DRT-0142": { - "value": 5, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0254": { - "value": 3, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0256": { - "value": 5, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0260": { - "value": 2, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:PDN-1031": { - "value": 2, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0014": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0015": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0016": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0017": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0142": { - "value": 5, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:RSZ-0095": { - "value": 1, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { "value": 13122.1, "compare": "<=" @@ -73,7 +8,7 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 16726, + "value": 16686, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { @@ -93,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -47.4, + "value": -40.0, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -314.0, + "value": -1720.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -113,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -56.6, + "value": -40.0, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -471.0, + "value": -160.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -144,22 +79,6 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -40.0, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -160.0, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -52.2, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -636.0, - "compare": ">=" - }, "finish__timing__setup__ws": { "value": -40.0, "compare": ">=" @@ -173,11 +92,11 @@ "compare": ">=" }, "finish__timing__hold__tns": { - "value": -160.0, + "value": -224.0, "compare": ">=" }, "finish__design__instance__area": { - "value": 17355, + "value": 17217, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/gf180/aes-hybrid/rules-base.json b/flow/designs/gf180/aes-hybrid/rules-base.json index f8f13bb56c..c68c0f2987 100644 --- a/flow/designs/gf180/aes-hybrid/rules-base.json +++ b/flow/designs/gf180/aes-hybrid/rules-base.json @@ -1,54 +1,4 @@ { - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:DRT-0349": { - "value": 8, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0075": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0014": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0349": { - "value": 8, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { "value": 489779.41376, "compare": "<=" @@ -58,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 653324, + "value": 650139, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 21930, + "value": 21903, "compare": "<=" }, "detailedplace__design__violations": { @@ -82,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -160.0, + "value": -145.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -102,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -187.0, + "value": -160.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -114,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 1503289, + "value": 1501193, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -129,28 +79,12 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -0.743, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -83.5, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -0.15, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -0.6, - "compare": ">=" - }, "finish__timing__setup__ws": { - "value": -1.3, + "value": -1.28, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -181.0, + "value": -156.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/gf180/aes/rules-base.json b/flow/designs/gf180/aes/rules-base.json index 45b5deead7..316c98c609 100644 --- a/flow/designs/gf180/aes/rules-base.json +++ b/flow/designs/gf180/aes/rules-base.json @@ -1,64 +1,4 @@ { - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:DRT-0120": { - "value": 2, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:DRT-0349": { - "value": 8, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0075": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0014": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0120": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0349": { - "value": 8, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { "value": 620000.0, "compare": "<=" @@ -68,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 807422, + "value": 806649, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 24309, + "value": 24274, "compare": "<=" }, "detailedplace__design__violations": { @@ -92,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -126.0, + "value": -107.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -108,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -1.12, + "value": -1.08, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -149.0, + "value": -124.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -124,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 1375727, + "value": 1368635, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -139,28 +79,12 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -0.662, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -64.1, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -0.15, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -0.6, - "compare": ">=" - }, "finish__timing__setup__ws": { "value": -1.05, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -141.0, + "value": -118.0, "compare": ">=" }, "finish__timing__hold__ws": { @@ -172,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 853113, + "value": 844209, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/gf180/ibex/config.mk b/flow/designs/gf180/ibex/config.mk index ed5fd3dd6e..50ac1389fa 100644 --- a/flow/designs/gf180/ibex/config.mk +++ b/flow/designs/gf180/ibex/config.mk @@ -14,3 +14,6 @@ export SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint. export CORE_UTILIZATION = 45 export PLACE_DENSITY_LB_ADDON = 0.1 + +export SWAP_ARITH_OPERATORS = 1 +export OPENROAD_HIERARCHICAL = 1 diff --git a/flow/designs/gf180/ibex/rules-base.json b/flow/designs/gf180/ibex/rules-base.json index 41a6f790b3..3f7a62d37a 100644 --- a/flow/designs/gf180/ibex/rules-base.json +++ b/flow/designs/gf180/ibex/rules-base.json @@ -1,66 +1,6 @@ { - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:DRT-0120": { - "value": 12, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:DRT-0349": { - "value": 8, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0075": { - "value": 643, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0014": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0120": { - "value": 6, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0349": { - "value": 8, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:RSZ-0095": { - "value": 1, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { - "value": 719000.0, + "value": 673000.0, "compare": "<=" }, "constraints__clocks__count": { @@ -68,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 756103, + "value": 735895, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 16806, + "value": 16149, "compare": "<=" }, "detailedplace__design__violations": { @@ -80,19 +20,19 @@ "compare": "==" }, "cts__design__instance__count__setup_buffer": { - "value": 1461, + "value": 1404, "compare": "<=" }, "cts__design__instance__count__hold_buffer": { - "value": 1461, + "value": 1404, "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.786, + "value": -0.518, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -44.8, + "value": -2.04, "compare": ">=" }, "cts__timing__hold__ws": { @@ -108,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.893, + "value": -0.683, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -93.6, + "value": -23.8, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -124,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 1457917, + "value": 1368568, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -139,28 +79,12 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -0.5, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -2.0, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -0.5, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -2.0, - "compare": ">=" - }, "finish__timing__setup__ws": { - "value": -0.803, + "value": -0.679, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -52.5, + "value": -11.1, "compare": ">=" }, "finish__timing__hold__ws": { @@ -172,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 800080, + "value": 773257, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/gf180/jpeg/config.mk b/flow/designs/gf180/jpeg/config.mk index c9d0d82196..799d1aaad6 100644 --- a/flow/designs/gf180/jpeg/config.mk +++ b/flow/designs/gf180/jpeg/config.mk @@ -9,3 +9,6 @@ export SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint. export CORE_UTILIZATION = 45 export PLACE_DENSITY_LB_ADDON = 0.20 export IO_CONSTRAINTS = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/io.tcl + +export SWAP_ARITH_OPERATORS = 1 +export OPENROAD_HIERARCHICAL = 1 diff --git a/flow/designs/gf180/jpeg/rules-base.json b/flow/designs/gf180/jpeg/rules-base.json index 2d1ce84cae..9da8363f53 100644 --- a/flow/designs/gf180/jpeg/rules-base.json +++ b/flow/designs/gf180/jpeg/rules-base.json @@ -1,44 +1,4 @@ { - "detailedroute__flow__warnings__count:DRT-0120": { - "value": 144, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:DRT-0349": { - "value": 8, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0014": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0120": { - "value": 48, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0349": { - "value": 8, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { "value": 2161429.49, "compare": "<=" @@ -52,7 +12,7 @@ "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 53612, + "value": 51347, "compare": "<=" }, "detailedplace__design__violations": { @@ -60,11 +20,11 @@ "compare": "==" }, "cts__design__instance__count__setup_buffer": { - "value": 4662, + "value": 4465, "compare": "<=" }, "cts__design__instance__count__hold_buffer": { - "value": 4662, + "value": 4465, "compare": "<=" }, "cts__timing__setup__ws": { @@ -104,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 2810762, + "value": 2728428, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -119,22 +79,6 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -0.375, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -1.5, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -0.375, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -1.5, - "compare": ">=" - }, "finish__timing__setup__ws": { "value": -0.375, "compare": ">=" diff --git a/flow/designs/gf180/riscv32i/config.mk b/flow/designs/gf180/riscv32i/config.mk index 7d5e0451a4..fedb328e2d 100644 --- a/flow/designs/gf180/riscv32i/config.mk +++ b/flow/designs/gf180/riscv32i/config.mk @@ -11,3 +11,6 @@ export TNS_END_PERCENT = 100 export SKIP_GATE_CLONING = 1 export PLACE_PINS_ARGS = -min_distance 5 export IO_CONSTRAINTS = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/io.tcl + +export SWAP_ARITH_OPERATORS = 1 +export OPENROAD_HIERARCHICAL = 1 diff --git a/flow/designs/gf180/riscv32i/rules-base.json b/flow/designs/gf180/riscv32i/rules-base.json index e14cde7ba4..d21b696a04 100644 --- a/flow/designs/gf180/riscv32i/rules-base.json +++ b/flow/designs/gf180/riscv32i/rules-base.json @@ -1,51 +1,6 @@ { - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:DRT-0349": { - "value": 8, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0075": { - "value": 54, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0014": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0349": { - "value": 8, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { - "value": 355874.87, + "value": 330000.0, "compare": "<=" }, "constraints__clocks__count": { @@ -53,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 370441, + "value": 380929, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 9602, + "value": 8384, "compare": "<=" }, "detailedplace__design__violations": { @@ -73,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.726, + "value": -0.5, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -2.23, + "value": -2.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -93,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.795, + "value": -0.5, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -2.3, + "value": -2.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -109,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 817804, + "value": 657404, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -124,28 +79,12 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -0.5, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -2.0, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -0.5, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -2.0, - "compare": ">=" - }, "finish__timing__setup__ws": { - "value": -0.834, + "value": -0.5, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -2.38, + "value": -2.0, "compare": ">=" }, "finish__timing__hold__ws": { @@ -157,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 388398, + "value": 392955, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/gf180/uart-blocks/rules-base.json b/flow/designs/gf180/uart-blocks/rules-base.json index 73dca907ee..40b0e2f6c8 100644 --- a/flow/designs/gf180/uart-blocks/rules-base.json +++ b/flow/designs/gf180/uart-blocks/rules-base.json @@ -1,34 +1,4 @@ { - "detailedroute__flow__warnings__count:DRT-0349": { - "value": 8, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:TAP-0014": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0349": { - "value": 8, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { "value": 61300.0, "compare": "<=" @@ -42,7 +12,7 @@ "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 726, + "value": 714, "compare": "<=" }, "detailedplace__design__violations": { @@ -50,11 +20,11 @@ "compare": "==" }, "cts__design__instance__count__setup_buffer": { - "value": 63, + "value": 62, "compare": "<=" }, "cts__design__instance__count__hold_buffer": { - "value": 63, + "value": 62, "compare": "<=" }, "cts__timing__setup__ws": { @@ -94,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 17413, + "value": 17036, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -109,22 +79,6 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -0.3, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -1.2, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -0.3, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -1.2, - "compare": ">=" - }, "finish__timing__setup__ws": { "value": -0.3, "compare": ">=" diff --git a/flow/designs/ihp-sg13g2/aes/rules-base.json b/flow/designs/ihp-sg13g2/aes/rules-base.json index ee69fbc018..f656b91241 100644 --- a/flow/designs/ihp-sg13g2/aes/rules-base.json +++ b/flow/designs/ihp-sg13g2/aes/rules-base.json @@ -1,31 +1,6 @@ { - "detailedroute__flow__warnings__count:DRT-0349": { - "value": 10, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:FIN-0010": { - "value": 12, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0349": { - "value": 10, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { - "value": 217000.0, + "value": 214000.0, "compare": "<=" }, "constraints__clocks__count": { @@ -33,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 203465, + "value": 200905, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 18984, + "value": 18614, "compare": "<=" }, "detailedplace__design__violations": { @@ -104,22 +79,6 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -0.225, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -0.9, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -0.225, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -0.9, - "compare": ">=" - }, "finish__timing__setup__ws": { "value": -0.225, "compare": ">=" @@ -137,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 1054989, + "value": 204761, "compare": "<=" } -} +} \ No newline at end of file diff --git a/flow/designs/ihp-sg13g2/gcd/config.mk b/flow/designs/ihp-sg13g2/gcd/config.mk index 7fceb006ae..fc554fb8f8 100644 --- a/flow/designs/ihp-sg13g2/gcd/config.mk +++ b/flow/designs/ihp-sg13g2/gcd/config.mk @@ -9,3 +9,6 @@ export USE_FILL = 1 export PLACE_DENSITY ?= 0.88 export CORE_UTILIZATION = 20 export TNS_END_PERCENT = 100 + +export SWAP_ARITH_OPERATORS = 1 +export OPENROAD_HIERARCHICAL = 1 diff --git a/flow/designs/ihp-sg13g2/gcd/rules-base.json b/flow/designs/ihp-sg13g2/gcd/rules-base.json index 03134bc6fe..8c7b58a53a 100644 --- a/flow/designs/ihp-sg13g2/gcd/rules-base.json +++ b/flow/designs/ihp-sg13g2/gcd/rules-base.json @@ -1,36 +1,6 @@ { - "detailedroute__flow__warnings__count:DRT-0349": { - "value": 10, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:FIN-0010": { - "value": 12, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0349": { - "value": 10, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { - "value": 6828.9632, + "value": 5260.0, "compare": "<=" }, "constraints__clocks__count": { @@ -38,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 7382, + "value": 6197, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 614, + "value": 508, "compare": "<=" }, "detailedplace__design__violations": { @@ -94,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 15132, + "value": 11161, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -109,22 +79,6 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -0.13, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -0.52, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -0.13, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -0.52, - "compare": ">=" - }, "finish__timing__setup__ws": { "value": -0.13, "compare": ">=" @@ -142,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 7693, + "value": 6473, "compare": "<=" } -} +} \ No newline at end of file diff --git a/flow/designs/ihp-sg13g2/i2c-gpio-expander/I2cDeviceCtrl/constraint.sdc b/flow/designs/ihp-sg13g2/i2c-gpio-expander/I2cDeviceCtrl/constraint.sdc index 95787b8df0..b86c899166 100644 --- a/flow/designs/ihp-sg13g2/i2c-gpio-expander/I2cDeviceCtrl/constraint.sdc +++ b/flow/designs/ihp-sg13g2/i2c-gpio-expander/I2cDeviceCtrl/constraint.sdc @@ -16,7 +16,5 @@ set all_inputs_wo_clk_rst_clock [lreplace [all_inputs] $clk_indx_clock $clk_indx set_input_delay $input_delay_value_clock -clock [get_clocks clock] $all_inputs_wo_clk_rst_clock set_output_delay $output_delay_value_clock -clock [get_clocks clock] [all_outputs] -set_load -pin_load 5 [all_inputs] -set_load -pin_load 5 [all_outputs] set_timing_derate -early 0.95 set_timing_derate -late 1.05 diff --git a/flow/designs/ihp-sg13g2/i2c-gpio-expander/rules-base.json b/flow/designs/ihp-sg13g2/i2c-gpio-expander/rules-base.json index b8120e3c61..e34b64b083 100644 --- a/flow/designs/ihp-sg13g2/i2c-gpio-expander/rules-base.json +++ b/flow/designs/ihp-sg13g2/i2c-gpio-expander/rules-base.json @@ -1,89 +1,4 @@ { - "cts__flow__warnings__count:STA-1140": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedplace__flow__warnings__count:STA-1140": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:DRT-0349": { - "value": 10, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:STA-1140": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:STA-1140": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:PAD-0033": { - "value": 4, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:STA-0347": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:STA-1140": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:PDN-0189": { - "value": 2, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:STA-1140": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:STA-1140": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0349": { - "value": 10, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:STA-1140": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:RSZ-0020": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:STA-1140": { - "value": 1, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { "value": 286097.29, "compare": "<=" @@ -97,7 +12,7 @@ "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 953, + "value": 951, "compare": "<=" }, "detailedplace__design__violations": { @@ -149,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 38502, + "value": 37773, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -164,22 +79,6 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -1.0, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -4.0, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -1.0, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -4.0, - "compare": ">=" - }, "finish__timing__setup__ws": { "value": -1.0, "compare": ">=" diff --git a/flow/designs/ihp-sg13g2/ibex/config.mk b/flow/designs/ihp-sg13g2/ibex/config.mk index 7663a4ad86..6f71860ef2 100644 --- a/flow/designs/ihp-sg13g2/ibex/config.mk +++ b/flow/designs/ihp-sg13g2/ibex/config.mk @@ -15,7 +15,10 @@ export SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint. # Adders degrade ibex setup repair export ADDER_MAP_FILE := -export CORE_UTILIZATION = 35 +export CORE_UTILIZATION = 70 export PLACE_DENSITY_LB_ADDON = 0.2 export TNS_END_PERCENT = 100 export CTS_BUF_DISTANCE = 60 + +export SWAP_ARITH_OPERATORS = 1 +export OPENROAD_HIERARCHICAL = 1 diff --git a/flow/designs/ihp-sg13g2/ibex/constraint.sdc b/flow/designs/ihp-sg13g2/ibex/constraint.sdc index fed426995f..cbf4208c5b 100644 --- a/flow/designs/ihp-sg13g2/ibex/constraint.sdc +++ b/flow/designs/ihp-sg13g2/ibex/constraint.sdc @@ -2,7 +2,7 @@ current_design ibex_core set clk_name core_clock set clk_port_name clk_i -set clk_period 10.0 +set clk_period 8.0 set clk_io_pct 0.2 set clk_port [get_ports $clk_port_name] diff --git a/flow/designs/ihp-sg13g2/ibex/rules-base.json b/flow/designs/ihp-sg13g2/ibex/rules-base.json index e0fdfc5027..dc15566d0f 100644 --- a/flow/designs/ihp-sg13g2/ibex/rules-base.json +++ b/flow/designs/ihp-sg13g2/ibex/rules-base.json @@ -1,6 +1,6 @@ { "synth__design__instance__area__stdcell": { - "value": 305820.24, + "value": 280000.0, "compare": "<=" }, "constraints__clocks__count": { @@ -12,7 +12,7 @@ "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 20731, + "value": 20659, "compare": "<=" }, "detailedplace__design__violations": { @@ -28,19 +28,19 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.5, + "value": -0.4, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -2.0, + "value": -1.6, "compare": ">=" }, "cts__timing__hold__ws": { - "value": -0.5, + "value": -0.4, "compare": ">=" }, "cts__timing__hold__tns": { - "value": -2.0, + "value": -1.6, "compare": ">=" }, "globalroute__antenna_diodes_count": { @@ -48,23 +48,23 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.5, + "value": -0.406, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -2.0, + "value": -1.61, "compare": ">=" }, "globalroute__timing__hold__ws": { - "value": -0.5, + "value": -0.4, "compare": ">=" }, "globalroute__timing__hold__tns": { - "value": -2.0, + "value": -1.6, "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 989089, + "value": 897596, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -79,36 +79,20 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -0.5, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -2.0, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -0.5, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -2.0, - "compare": ">=" - }, "finish__timing__setup__ws": { - "value": -0.5, + "value": -0.4, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -2.0, + "value": -1.6, "compare": ">=" }, "finish__timing__hold__ws": { - "value": -0.5, + "value": -0.4, "compare": ">=" }, "finish__timing__hold__tns": { - "value": -2.0, + "value": -1.6, "compare": ">=" }, "finish__design__instance__area": { diff --git a/flow/designs/ihp-sg13g2/jpeg/rules-base.json b/flow/designs/ihp-sg13g2/jpeg/rules-base.json index 5eca92e9cc..98d0190bdc 100644 --- a/flow/designs/ihp-sg13g2/jpeg/rules-base.json +++ b/flow/designs/ihp-sg13g2/jpeg/rules-base.json @@ -12,7 +12,7 @@ "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 86433, + "value": 86398, "compare": "<=" }, "detailedplace__design__violations": { @@ -76,25 +76,9 @@ "compare": "<=" }, "detailedroute__antenna_diodes_count": { - "value": 132, + "value": 115, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -0.4, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -1.6, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -0.4, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -1.6, - "compare": ">=" - }, "finish__timing__setup__ws": { "value": -0.4, "compare": ">=" @@ -112,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 1059270, + "value": 1053077, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/ihp-sg13g2/riscv32i/config.mk b/flow/designs/ihp-sg13g2/riscv32i/config.mk index be6c25a640..e2bbb90b2d 100644 --- a/flow/designs/ihp-sg13g2/riscv32i/config.mk +++ b/flow/designs/ihp-sg13g2/riscv32i/config.mk @@ -11,3 +11,6 @@ export CORE_UTILIZATION = 35 export PLACE_DENSITY_LB_ADDON = 0.2 export TNS_END_PERCENT = 100 export CTS_BUF_DISTANCE = 60 + +export SWAP_ARITH_OPERATORS = 1 +export OPENROAD_HIERARCHICAL = 1 diff --git a/flow/designs/ihp-sg13g2/riscv32i/rules-base.json b/flow/designs/ihp-sg13g2/riscv32i/rules-base.json index 0e911b7b11..5edbe27f48 100644 --- a/flow/designs/ihp-sg13g2/riscv32i/rules-base.json +++ b/flow/designs/ihp-sg13g2/riscv32i/rules-base.json @@ -1,6 +1,6 @@ { "synth__design__instance__area__stdcell": { - "value": 151466.57, + "value": 137000.0, "compare": "<=" }, "constraints__clocks__count": { @@ -8,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 156945, + "value": 155238, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 10816, + "value": 10428, "compare": "<=" }, "detailedplace__design__violations": { @@ -64,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 506565, + "value": 470173, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -79,22 +79,6 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -0.3, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -1.2, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -0.3, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -1.2, - "compare": ">=" - }, "finish__timing__setup__ws": { "value": -0.3, "compare": ">=" @@ -112,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 168818, + "value": 161066, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/ihp-sg13g2/spi/config.mk b/flow/designs/ihp-sg13g2/spi/config.mk index d791fbec23..a424342b62 100644 --- a/flow/designs/ihp-sg13g2/spi/config.mk +++ b/flow/designs/ihp-sg13g2/spi/config.mk @@ -9,3 +9,6 @@ export USE_FILL = 1 export PLACE_DENSITY ?= 0.88 export CORE_UTILIZATION = 20 export TNS_END_PERCENT = 100 + +export SWAP_ARITH_OPERATORS = 1 +export OPENROAD_HIERARCHICAL = 1 diff --git a/flow/designs/ihp-sg13g2/spi/rules-base.json b/flow/designs/ihp-sg13g2/spi/rules-base.json index 9f5cac13a7..c7d454499b 100644 --- a/flow/designs/ihp-sg13g2/spi/rules-base.json +++ b/flow/designs/ihp-sg13g2/spi/rules-base.json @@ -1,51 +1,6 @@ { - "detailedroute__flow__warnings__count:DRT-0349": { - "value": 10, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0075": { - "value": 25, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:FIN-0010": { - "value": 12, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0349": { - "value": 10, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { - "value": 2232.28, + "value": 2180.0, "compare": "<=" }, "constraints__clocks__count": { @@ -53,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 2662, + "value": 2635, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 179, + "value": 178, "compare": "<=" }, "detailedplace__design__violations": { @@ -97,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": 0.0, + "value": -0.213, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -109,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 3686, + "value": 3632, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -124,22 +79,6 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -0.045, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -0.18, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -0.045, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -0.18, - "compare": ">=" - }, "finish__timing__setup__ws": { "value": -0.045, "compare": ">=" @@ -157,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 2767, + "value": 2758, "compare": "<=" } -} +} \ No newline at end of file diff --git a/flow/designs/nangate45/aes/config.mk b/flow/designs/nangate45/aes/config.mk index 7008a46a9f..e859d0d4a2 100644 --- a/flow/designs/nangate45/aes/config.mk +++ b/flow/designs/nangate45/aes/config.mk @@ -13,3 +13,6 @@ export REMOVE_CELLS_FOR_EQY = TAPCELL* # workaround for high congestion in post-grt repair export SKIP_INCREMENTAL_REPAIR = 1 + +export SWAP_ARITH_OPERATORS = 1 +export OPENROAD_HIERARCHICAL = 1 diff --git a/flow/designs/nangate45/aes/rules-base.json b/flow/designs/nangate45/aes/rules-base.json index db6b3d1039..215e67dff2 100644 --- a/flow/designs/nangate45/aes/rules-base.json +++ b/flow/designs/nangate45/aes/rules-base.json @@ -1,41 +1,6 @@ { - "detailedroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0075": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:PDN-1041": { - "value": 270, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { - "value": 23300.0, + "value": 19700.0, "compare": "<=" }, "constraints__clocks__count": { @@ -43,7 +8,7 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 26064, + "value": 23359, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { @@ -83,23 +48,23 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.0685, + "value": -0.0545, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -0.799, + "value": -0.23, "compare": ">=" }, "globalroute__timing__hold__ws": { - "value": -0.0441, + "value": -0.041, "compare": ">=" }, "globalroute__timing__hold__tns": { - "value": -0.171, + "value": -0.164, "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 288398, + "value": 271242, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -114,28 +79,12 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -0.041, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -0.164, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -0.041, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -0.164, - "compare": ">=" - }, "finish__timing__setup__ws": { - "value": -0.071, + "value": -0.0473, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -1.08, + "value": -0.182, "compare": ">=" }, "finish__timing__hold__ws": { @@ -147,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 26342, + "value": 23609, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/nangate45/ariane133/ariane.sdc b/flow/designs/nangate45/ariane133/ariane.sdc index afdb3c3501..5d4d3da203 100644 --- a/flow/designs/nangate45/ariane133/ariane.sdc +++ b/flow/designs/nangate45/ariane133/ariane.sdc @@ -3,4 +3,16 @@ set sdc_version 2.0 # Set the current design current_design ariane -create_clock -name "core_clock" -period 4.0 -waveform {0.0 2.0} [get_ports clk_i] +set clk_name core_clock +set clk_port_name clk_i +set clk_period 3.0 +set clk_io_pct 0.2 + +set clk_port [get_ports $clk_port_name] + +create_clock -name $clk_name -period $clk_period $clk_port + +set non_clock_inputs [all_inputs -no_clocks] + +set_input_delay [expr $clk_period * $clk_io_pct] -clock $clk_name $non_clock_inputs +set_output_delay [expr $clk_period * $clk_io_pct] -clock $clk_name [all_outputs] diff --git a/flow/designs/nangate45/ariane133/config.mk b/flow/designs/nangate45/ariane133/config.mk index 1de1c20457..9c24982374 100644 --- a/flow/designs/nangate45/ariane133/config.mk +++ b/flow/designs/nangate45/ariane133/config.mk @@ -12,12 +12,18 @@ export SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/ariane133/ariane.sdc export ADDITIONAL_LEFS = $(PLATFORM_DIR)/lef/fakeram45_256x16.lef export ADDITIONAL_LIBS = $(PLATFORM_DIR)/lib/fakeram45_256x16.lib -export DIE_AREA = 0 0 1500 1500 -export CORE_AREA = 10 12 1448 1448 +export CORE_UTILIZATION = 50 +export CORE_ASPECT_RATIO = 1 +export CORE_MARGIN = 5 export IO_CONSTRAINTS = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/io.tcl -export MACRO_PLACE_HALO = 10 10 +export MACRO_PLACE_HALO = 8 8 -export TNS_END_PERCENT = 100 export SKIP_GATE_CLONING = 1 + +export RTLMP_MAX_LEVEL = 1 +export RTLMP_MAX_MACRO = 10 +export RTLMP_MIN_MACRO = 1 +export RTLMP_MAX_INST = 80000 +export RTLMP_MIN_INST = 8000 diff --git a/flow/designs/nangate45/ariane133/rules-base.json b/flow/designs/nangate45/ariane133/rules-base.json index dad310eeb7..65f75e24d5 100644 --- a/flow/designs/nangate45/ariane133/rules-base.json +++ b/flow/designs/nangate45/ariane133/rules-base.json @@ -1,39 +1,4 @@ { - "detailedroute__flow__warnings__count:DRT-0120": { - "value": 11, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0120": { - "value": 11, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { "value": 825864.85, "compare": "<=" @@ -63,19 +28,19 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.2, + "value": -0.261, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -0.8, + "value": -272.0, "compare": ">=" }, "cts__timing__hold__ws": { - "value": -0.2, + "value": -0.15, "compare": ">=" }, "cts__timing__hold__tns": { - "value": -0.8, + "value": -0.6, "compare": ">=" }, "globalroute__antenna_diodes_count": { @@ -83,23 +48,23 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.2, + "value": -0.258, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -0.8, + "value": -409.0, "compare": ">=" }, "globalroute__timing__hold__ws": { - "value": -0.2, + "value": -0.15, "compare": ">=" }, "globalroute__timing__hold__tns": { - "value": -0.8, + "value": -0.6, "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 7160156, + "value": 7775102, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -114,36 +79,20 @@ "value": 194, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -0.2, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -0.8, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -0.2, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -0.8, - "compare": ">=" - }, "finish__timing__setup__ws": { - "value": -0.264, + "value": -0.254, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -88.9, + "value": -387.0, "compare": ">=" }, "finish__timing__hold__ws": { - "value": -0.2, + "value": -0.15, "compare": ">=" }, "finish__timing__hold__tns": { - "value": -0.8, + "value": -0.6, "compare": ">=" }, "finish__design__instance__area": { diff --git a/flow/designs/nangate45/ariane136/rules-base.json b/flow/designs/nangate45/ariane136/rules-base.json index 1ea2f44672..f712069808 100644 --- a/flow/designs/nangate45/ariane136/rules-base.json +++ b/flow/designs/nangate45/ariane136/rules-base.json @@ -1,49 +1,4 @@ { - "cts__flow__warnings__count:RSZ-0066": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:DRT-0120": { - "value": 3, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:STA-0441": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0120": { - "value": 3, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { "value": 845982.06, "compare": "<=" @@ -81,11 +36,11 @@ "compare": ">=" }, "cts__timing__hold__ws": { - "value": -0.747, + "value": -0.693, "compare": ">=" }, "cts__timing__hold__tns": { - "value": -5.49, + "value": -5.13, "compare": ">=" }, "globalroute__antenna_diodes_count": { @@ -109,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 7658811, + "value": 8033923, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -124,22 +79,6 @@ "value": 202, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -0.3, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -1.2, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -0.326, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -1.49, - "compare": ">=" - }, "finish__timing__setup__ws": { "value": -0.3, "compare": ">=" diff --git a/flow/designs/nangate45/black_parrot/macro_placement.tcl b/flow/designs/nangate45/black_parrot/macro_placement.tcl index 41f518ed76..91393f2a93 100644 --- a/flow/designs/nangate45/black_parrot/macro_placement.tcl +++ b/flow/designs/nangate45/black_parrot/macro_placement.tcl @@ -12,32 +12,32 @@ place_macro \ place_macro \ -macro_name multi_top.rof1_0__core/be.be_mmu.dcache/data_mem_0__data_mem.macro_mem/mem \ - -location {1177.31 1166.095} -orientation R0 + -location {1177.31 1165.095} -orientation R0 place_macro \ -macro_name multi_top.rof1_0__core/be.be_mmu.dcache/data_mem_1__data_mem.macro_mem/mem \ - -location {659.6 1166.095} -orientation MY + -location {659.6 1165.095} -orientation MY place_macro \ -macro_name multi_top.rof1_0__core/be.be_mmu.dcache/data_mem_2__data_mem.macro_mem/mem \ - -location {1177.31 1032.605} -orientation MX + -location {1177.31 1031.605} -orientation MX place_macro \ -macro_name multi_top.rof1_0__core/be.be_mmu.dcache/data_mem_3__data_mem.macro_mem/mem \ - -location {832.17 1166.095} -orientation R0 + -location {832.17 1165.095} -orientation R0 place_macro \ -macro_name multi_top.rof1_0__core/be.be_mmu.dcache/data_mem_4__data_mem.macro_mem/mem \ - -location {1004.74 1032.605} -orientation MX + -location {1004.74 1031.605} -orientation MX place_macro \ -macro_name multi_top.rof1_0__core/be.be_mmu.dcache/data_mem_5__data_mem.macro_mem/mem \ - -location {832.17 1032.605} -orientation MX + -location {832.17 1031.605} -orientation MX place_macro \ -macro_name multi_top.rof1_0__core/be.be_mmu.dcache/data_mem_6__data_mem.macro_mem/mem \ - -location {1004.74 1166.095} -orientation R0 + -location {1004.74 1165.095} -orientation R0 place_macro \ -macro_name multi_top.rof1_0__core/be.be_mmu.dcache/data_mem_7__data_mem.macro_mem/mem \ - -location {659.6 1032.605} -orientation R180 + -location {659.6 1031.605} -orientation R180 diff --git a/flow/designs/nangate45/black_parrot/rules-base.json b/flow/designs/nangate45/black_parrot/rules-base.json index 46a193c331..fc21694bef 100644 --- a/flow/designs/nangate45/black_parrot/rules-base.json +++ b/flow/designs/nangate45/black_parrot/rules-base.json @@ -1,66 +1,6 @@ { - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:DRT-0120": { - "value": 42, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0075": { - "value": 321, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:PDN-0195": { - "value": 44, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:PDN-1041": { - "value": 270, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0120": { - "value": 42, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { - "value": 777884.7342, + "value": 777000.0, "compare": "<=" }, "constraints__clocks__count": { @@ -68,7 +8,7 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 775367, + "value": 774157, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { @@ -88,7 +28,7 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -2.73, + "value": -2.88, "compare": ">=" }, "cts__timing__setup__tns": { @@ -108,7 +48,7 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -2.73, + "value": -3.04, "compare": ">=" }, "globalroute__timing__setup__tns": { @@ -124,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 7048481, + "value": 6985506, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -139,24 +79,8 @@ "value": 5, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -4.94, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -266.0, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -0.885, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -15.7, - "compare": ">=" - }, "finish__timing__setup__ws": { - "value": -2.67, + "value": -2.85, "compare": ">=" }, "finish__timing__setup__tns": { @@ -172,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 789561, + "value": 788072, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/nangate45/bp_be_top/rules-base.json b/flow/designs/nangate45/bp_be_top/rules-base.json index a044639fc3..f991e58505 100644 --- a/flow/designs/nangate45/bp_be_top/rules-base.json +++ b/flow/designs/nangate45/bp_be_top/rules-base.json @@ -1,49 +1,4 @@ { - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0011": { - "value": 2, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0075": { - "value": 13, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:PDN-0195": { - "value": 11, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { "value": 268204.56, "compare": "<=" @@ -73,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.333, + "value": -0.263, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -19.9, + "value": -22.5, "compare": ">=" }, "cts__timing__hold__ws": { @@ -93,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.335, + "value": -0.3, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -19.8, + "value": -25.3, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -109,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 2566212, + "value": 2504235, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -124,28 +79,12 @@ "value": 5, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": 0.0, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": 0.0, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": 0.0, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": 0.0, - "compare": ">=" - }, "finish__timing__setup__ws": { - "value": -0.392, + "value": -0.295, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -28.7, + "value": -26.3, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/nangate45/bp_fe_top/rules-base.json b/flow/designs/nangate45/bp_fe_top/rules-base.json index ade82f774e..e98d566dbf 100644 --- a/flow/designs/nangate45/bp_fe_top/rules-base.json +++ b/flow/designs/nangate45/bp_fe_top/rules-base.json @@ -1,54 +1,4 @@ { - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0011": { - "value": 2, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:PDN-0195": { - "value": 11, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:PDN-1041": { - "value": 270, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { "value": 241575.35, "compare": "<=" @@ -78,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.0132, + "value": -0.09, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -0.0249, + "value": -0.36, "compare": ">=" }, "cts__timing__hold__ws": { @@ -98,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.0931, + "value": -0.09, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -0.367, + "value": -0.36, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -114,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 1659471, + "value": 1658769, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -129,28 +79,12 @@ "value": 5, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": 0.0, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": 0.0, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": 0.0, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": 0.0, - "compare": ">=" - }, "finish__timing__setup__ws": { - "value": -0.127, + "value": -0.123, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -8.97, + "value": -6.17, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/nangate45/bp_multi_top/config.mk b/flow/designs/nangate45/bp_multi_top/config.mk index e05d37d2e5..8fd92869a9 100644 --- a/flow/designs/nangate45/bp_multi_top/config.mk +++ b/flow/designs/nangate45/bp_multi_top/config.mk @@ -32,3 +32,6 @@ export MACRO_PLACE_HALO = 10 10 export PLACE_DENSITY_LB_ADDON = 0.05 export SKIP_GATE_CLONING = 1 + +export SWAP_ARITH_OPERATORS = 1 +export OPENROAD_HIERARCHICAL = 1 diff --git a/flow/designs/nangate45/bp_multi_top/rules-base.json b/flow/designs/nangate45/bp_multi_top/rules-base.json index ed866dfbda..725bc4f5f6 100644 --- a/flow/designs/nangate45/bp_multi_top/rules-base.json +++ b/flow/designs/nangate45/bp_multi_top/rules-base.json @@ -1,66 +1,6 @@ { - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "cts__flow__warnings__count:RSZ-2021": { - "value": 102, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:DRT-0120": { - "value": 3, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0075": { - "value": 365, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:PDN-0195": { - "value": 46, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0120": { - "value": 3, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { - "value": 586679.15, + "value": 570000.0, "compare": "<=" }, "constraints__clocks__count": { @@ -68,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 587567, + "value": 580304, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 143977, + "value": 110096, "compare": "<=" }, "detailedplace__design__violations": { @@ -80,19 +20,19 @@ "compare": "==" }, "cts__design__instance__count__setup_buffer": { - "value": 12520, + "value": 9574, "compare": "<=" }, "cts__design__instance__count__hold_buffer": { - "value": 12520, + "value": 9574, "compare": "<=" }, "cts__timing__setup__ws": { - "value": -4.6, + "value": -0.24, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -5.28, + "value": -0.96, "compare": ">=" }, "cts__timing__hold__ws": { @@ -108,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -4.71, + "value": -0.24, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -5.4, + "value": -0.96, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -124,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 4180077, + "value": 3751068, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -139,28 +79,12 @@ "value": 5, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -6.13, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -607.0, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -1.48, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -105.0, - "compare": ">=" - }, "finish__timing__setup__ws": { - "value": -4.68, + "value": -0.24, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -5.36, + "value": -0.96, "compare": ">=" }, "finish__timing__hold__ws": { @@ -168,11 +92,11 @@ "compare": ">=" }, "finish__timing__hold__tns": { - "value": -0.1086, + "value": -0.96, "compare": ">=" }, "finish__design__instance__area": { - "value": 595583, + "value": 587157, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/nangate45/bp_quad/rules-base.json b/flow/designs/nangate45/bp_quad/rules-base.json new file mode 100644 index 0000000000..f486e1db81 --- /dev/null +++ b/flow/designs/nangate45/bp_quad/rules-base.json @@ -0,0 +1,202 @@ +{ + "cts__flow__warnings__count:CTS-0041": { + "value": 38, + "compare": "<=", + "level": "warning" + }, + "cts__flow__warnings__count:RSZ-0062": { + "value": 1, + "compare": "<=", + "level": "warning" + }, + "cts__flow__warnings__count:RSZ-0066": { + "value": 1, + "compare": "<=", + "level": "warning" + }, + "detailedroute__flow__warnings__count:DRT-0120": { + "value": 81, + "compare": "<=", + "level": "warning" + }, + "detailedroute__flow__warnings__count:GRT-0246": { + "value": 1, + "compare": "<=", + "level": "warning" + }, + "floorplan__flow__warnings__count:EST-0027": { + "value": 1, + "compare": "<=", + "level": "warning" + }, + "floorplan__flow__warnings__count:IFP-0028": { + "value": 1, + "compare": "<=", + "level": "warning" + }, + "floorplan__flow__warnings__count:RSZ-0062": { + "value": 1, + "compare": "<=", + "level": "warning" + }, + "floorplan__flow__warnings__count:RSZ-0075": { + "value": 1001, + "compare": "<=", + "level": "warning" + }, + "floorplan__flow__warnings__count:STA-0345": { + "value": 3, + "compare": "<=", + "level": "warning" + }, + "floorplan__flow__warnings__count:STA-0349": { + "value": 1, + "compare": "<=", + "level": "warning" + }, + "floorplan__flow__warnings__count:STA-0441": { + "value": 8, + "compare": "<=", + "level": "warning" + }, + "flow__warnings__count:PDN-0195": { + "value": 18, + "compare": "<=", + "level": "warning" + }, + "globalplace__flow__warnings__count:GRT-0281": { + "value": 4, + "compare": "<=", + "level": "warning" + }, + "globalroute__flow__warnings__count:DRT-0120": { + "value": 81, + "compare": "<=", + "level": "warning" + }, + "globalroute__flow__warnings__count:FLW-0010": { + "value": 1, + "compare": "<=", + "level": "warning" + }, + "globalroute__flow__warnings__count:GRT-0246": { + "value": 1, + "compare": "<=", + "level": "warning" + }, + "globalroute__flow__warnings__count:RSZ-0062": { + "value": 1, + "compare": "<=", + "level": "warning" + }, + "globalroute__flow__warnings__count:RSZ-0066": { + "value": 1, + "compare": "<=", + "level": "warning" + }, + "placeopt__flow__warnings__count:RSZ-0095": { + "value": 1, + "compare": "<=", + "level": "warning" + }, + "synth__design__instance__area__stdcell": { + "value": 5620000.0, + "compare": "<=" + }, + "constraints__clocks__count": { + "value": 8, + "compare": "==" + }, + "placeopt__design__instance__area": { + "value": 6079647, + "compare": "<=" + }, + "placeopt__design__instance__count__stdcell": { + "value": 1704487, + "compare": "<=" + }, + "detailedplace__design__violations": { + "value": 0, + "compare": "==" + }, + "cts__design__instance__count__setup_buffer": { + "value": 148216, + "compare": "<=" + }, + "cts__design__instance__count__hold_buffer": { + "value": 148216, + "compare": "<=" + }, + "cts__timing__setup__ws": { + "value": -150.0, + "compare": ">=" + }, + "cts__timing__setup__tns": { + "value": -38900000.0, + "compare": ">=" + }, + "cts__timing__hold__ws": { + "value": -151.0, + "compare": ">=" + }, + "cts__timing__hold__tns": { + "value": -39300000.0, + "compare": ">=" + }, + "globalroute__antenna_diodes_count": { + "value": 1713, + "compare": "<=" + }, + "globalroute__timing__setup__ws": { + "value": -150.0, + "compare": ">=" + }, + "globalroute__timing__setup__tns": { + "value": -38900000.0, + "compare": ">=" + }, + "globalroute__timing__hold__ws": { + "value": -151.0, + "compare": ">=" + }, + "globalroute__timing__hold__tns": { + "value": -39300000.0, + "compare": ">=" + }, + "detailedroute__route__wirelength": { + "value": 55217711, + "compare": "<=" + }, + "detailedroute__route__drc_errors": { + "value": 0, + "compare": "<=" + }, + "detailedroute__antenna__violating__nets": { + "value": 0, + "compare": "<=" + }, + "detailedroute__antenna_diodes_count": { + "value": 1713, + "compare": "<=" + }, + "finish__timing__setup__ws": { + "value": -150.0, + "compare": ">=" + }, + "finish__timing__setup__tns": { + "value": -38900000.0, + "compare": ">=" + }, + "finish__timing__hold__ws": { + "value": -151.0, + "compare": ">=" + }, + "finish__timing__hold__tns": { + "value": -39300000.0, + "compare": ">=" + }, + "finish__design__instance__area": { + "value": 6176926, + "compare": "<=" + } +} diff --git a/flow/designs/nangate45/dynamic_node/config.mk b/flow/designs/nangate45/dynamic_node/config.mk index 33365ed46c..3e514eccf8 100644 --- a/flow/designs/nangate45/dynamic_node/config.mk +++ b/flow/designs/nangate45/dynamic_node/config.mk @@ -12,3 +12,6 @@ export CORE_MARGIN = 5 export PLACE_DENSITY_LB_ADDON = 0.20 export TNS_END_PERCENT = 100 + +export SWAP_ARITH_OPERATORS = 1 +export OPENROAD_HIERARCHICAL = 1 diff --git a/flow/designs/nangate45/dynamic_node/rules-base.json b/flow/designs/nangate45/dynamic_node/rules-base.json index 35130f0f63..ace72b7a9d 100644 --- a/flow/designs/nangate45/dynamic_node/rules-base.json +++ b/flow/designs/nangate45/dynamic_node/rules-base.json @@ -1,51 +1,6 @@ { - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0075": { - "value": 11, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:PDN-1041": { - "value": 270, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { - "value": 25515.12, + "value": 24000.0, "compare": "<=" }, "constraints__clocks__count": { @@ -53,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 25745, + "value": 25251, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 12798, + "value": 12088, "compare": "<=" }, "detailedplace__design__violations": { @@ -65,19 +20,19 @@ "compare": "==" }, "cts__design__instance__count__setup_buffer": { - "value": 1113, + "value": 1051, "compare": "<=" }, "cts__design__instance__count__hold_buffer": { - "value": 1113, + "value": 1051, "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.482, + "value": -0.423, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -1.81, + "value": -1.51, "compare": ">=" }, "cts__timing__hold__ws": { @@ -93,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.463, + "value": -0.434, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -1.78, + "value": -1.63, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -109,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 229884, + "value": 219551, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -124,28 +79,12 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -0.3, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -1.2, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -0.3, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -1.2, - "compare": ">=" - }, "finish__timing__setup__ws": { - "value": -0.454, + "value": -0.408, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -1.86, + "value": -1.45, "compare": ">=" }, "finish__timing__hold__ws": { @@ -157,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 27349, + "value": 26358, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/nangate45/gcd/config.mk b/flow/designs/nangate45/gcd/config.mk index d7fc7a8bdd..b8ca1080a2 100644 --- a/flow/designs/nangate45/gcd/config.mk +++ b/flow/designs/nangate45/gcd/config.mk @@ -12,6 +12,7 @@ export CORE_UTILIZATION ?= 55 export PLACE_DENSITY_LB_ADDON = 0.20 export TNS_END_PERCENT = 100 export REMOVE_CELLS_FOR_EQY = TAPCELL* +export SYNTH_REPEATABLE_BUILD ?= 1 # This needs a smaller pitch to accomodate a small block export PDN_TCL ?= $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NAME)/grid_strategy-M1-M4-M7.tcl diff --git a/flow/designs/nangate45/gcd/rules-base.json b/flow/designs/nangate45/gcd/rules-base.json index 1fb1bc7827..3be227edcb 100644 --- a/flow/designs/nangate45/gcd/rules-base.json +++ b/flow/designs/nangate45/gcd/rules-base.json @@ -1,39 +1,4 @@ { - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { "value": 725.6, "compare": "<=" @@ -67,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -0.569, + "value": -0.532, "compare": ">=" }, "cts__timing__hold__ws": { @@ -87,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -0.695, + "value": -1.02, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -99,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 4628, + "value": 4515, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -114,28 +79,12 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -0.0525, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -0.322, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -0.023, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -0.092, - "compare": ">=" - }, "finish__timing__setup__ws": { - "value": -0.0774, + "value": -0.0744, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -0.629, + "value": -0.658, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/nangate45/ibex/rules-base.json b/flow/designs/nangate45/ibex/rules-base.json index 847d59d731..a0a7b9c806 100644 --- a/flow/designs/nangate45/ibex/rules-base.json +++ b/flow/designs/nangate45/ibex/rules-base.json @@ -1,46 +1,6 @@ { - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0075": { - "value": 191, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { - "value": 32643.82, + "value": 32500.0, "compare": "<=" }, "constraints__clocks__count": { @@ -48,7 +8,7 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 32826, + "value": 32579, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { @@ -68,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.12, + "value": -0.11, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -0.45, + "value": -0.44, "compare": ">=" }, "cts__timing__hold__ws": { @@ -88,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.118, + "value": -0.111, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -0.456, + "value": -0.443, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -104,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 307535, + "value": 294417, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -119,28 +79,12 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -0.11, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -0.44, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -0.11, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -0.44, - "compare": ">=" - }, "finish__timing__setup__ws": { - "value": -0.133, + "value": -0.11, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -2.93, + "value": -0.44, "compare": ">=" }, "finish__timing__hold__ws": { @@ -152,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 33700, + "value": 33440, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/nangate45/jpeg/rules-base.json b/flow/designs/nangate45/jpeg/rules-base.json index 04f21b34aa..e0b322c635 100644 --- a/flow/designs/nangate45/jpeg/rules-base.json +++ b/flow/designs/nangate45/jpeg/rules-base.json @@ -1,56 +1,6 @@ { - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:DRT-0120": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0075": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0120": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { - "value": 102576.23, + "value": 102000.0, "compare": "<=" }, "constraints__clocks__count": { @@ -82,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -35.6, + "value": -41.2, "compare": ">=" }, "cts__timing__hold__ws": { @@ -98,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.17, + "value": -0.153, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -43.2, + "value": -54.2, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -114,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 634316, + "value": 631144, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -129,28 +79,12 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -0.06, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -7.87, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -0.05, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -0.2, - "compare": ">=" - }, "finish__timing__setup__ws": { - "value": -0.159, + "value": -0.144, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -41.1, + "value": -42.1, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/nangate45/mempool_group/rules-base.json b/flow/designs/nangate45/mempool_group/rules-base.json index 6496f27877..e24a88539d 100644 --- a/flow/designs/nangate45/mempool_group/rules-base.json +++ b/flow/designs/nangate45/mempool_group/rules-base.json @@ -1,94 +1,4 @@ { - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:DRT-0120": { - "value": 2, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:STA-0450": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:STA-0450": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0075": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:STA-0345": { - "value": 2, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:PDN-1041": { - "value": 270, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:STA-0450": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0120": { - "value": 2, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:FLW-0010": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:STA-0450": { - "value": 2, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { "value": 271098.37, "compare": "<=" @@ -118,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -2.35, + "value": -2.31, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -12700.0, + "value": -11000.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -134,15 +44,15 @@ "compare": ">=" }, "globalroute__antenna_diodes_count": { - "value": 170, + "value": 169, "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -2.35, + "value": -2.31, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -12500.0, + "value": -11100.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -166,31 +76,15 @@ "compare": "<=" }, "detailedroute__antenna_diodes_count": { - "value": 170, + "value": 169, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -2.35, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -8320.0, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -0.15, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -0.6, - "compare": ">=" - }, "finish__timing__setup__ws": { - "value": -2.35, + "value": -2.31, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -12500.0, + "value": -10700.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/nangate45/swerv/rules-base.json b/flow/designs/nangate45/swerv/rules-base.json index 3357474ccb..89d210b90e 100644 --- a/flow/designs/nangate45/swerv/rules-base.json +++ b/flow/designs/nangate45/swerv/rules-base.json @@ -1,54 +1,4 @@ { - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:GRT-0115": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:GRT-0704": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { "value": 178043.59, "compare": "<=" @@ -82,7 +32,7 @@ "compare": ">=" }, "cts__timing__setup__tns": { - "value": -28.8, + "value": -9.64, "compare": ">=" }, "cts__timing__hold__ws": { @@ -102,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -32.8, + "value": -37.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -114,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 2814559, + "value": 2799467, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -129,28 +79,12 @@ "value": 102, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -0.1, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -0.4, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -0.107, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -6.48, - "compare": ">=" - }, "finish__timing__setup__ws": { "value": -0.235, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -38.3, + "value": -23.9, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/nangate45/swerv_wrapper/config.mk b/flow/designs/nangate45/swerv_wrapper/config.mk index 2ce3c88234..7cfe56aca9 100644 --- a/flow/designs/nangate45/swerv_wrapper/config.mk +++ b/flow/designs/nangate45/swerv_wrapper/config.mk @@ -23,3 +23,6 @@ export PLACE_DENSITY_LB_ADDON = 0.08 export TNS_END_PERCENT = 100 export FASTROUTE_TCL = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NAME)/fastroute.tcl + +export SWAP_ARITH_OPERATORS = 1 +export OPENROAD_HIERARCHICAL = 1 diff --git a/flow/designs/nangate45/swerv_wrapper/rules-base.json b/flow/designs/nangate45/swerv_wrapper/rules-base.json index 3bc1adbc01..54ec05cb2f 100644 --- a/flow/designs/nangate45/swerv_wrapper/rules-base.json +++ b/flow/designs/nangate45/swerv_wrapper/rules-base.json @@ -1,46 +1,6 @@ { - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:GRT-0115": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { - "value": 724516.2, + "value": 712000.0, "compare": "<=" }, "constraints__clocks__count": { @@ -48,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 730179, + "value": 726502, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 112854, + "value": 108442, "compare": "<=" }, "detailedplace__design__violations": { @@ -60,19 +20,19 @@ "compare": "==" }, "cts__design__instance__count__setup_buffer": { - "value": 9813, + "value": 9430, "compare": "<=" }, "cts__design__instance__count__hold_buffer": { - "value": 9813, + "value": 9430, "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.1, + "value": -0.163, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -36.7, + "value": -24.1, "compare": ">=" }, "cts__timing__hold__ws": { @@ -84,7 +44,7 @@ "compare": ">=" }, "globalroute__antenna_diodes_count": { - "value": 109, + "value": 106, "compare": "<=" }, "globalroute__timing__setup__ws": { @@ -92,7 +52,7 @@ "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -33.3, + "value": -1.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -104,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 4181462, + "value": 4011972, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -116,43 +76,27 @@ "compare": "<=" }, "detailedroute__antenna_diodes_count": { - "value": 109, + "value": 106, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -0.1, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -0.4, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -0.106, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -0.893, - "compare": ">=" - }, "finish__timing__setup__ws": { - "value": -0.225, + "value": -0.2, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -127.0, + "value": -7.3, "compare": ">=" }, "finish__timing__hold__ws": { - "value": -0.127, + "value": -0.11, "compare": ">=" }, "finish__timing__hold__tns": { - "value": -5.39, + "value": -2.0, "compare": ">=" }, "finish__design__instance__area": { - "value": 735619, + "value": 731983, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/nangate45/tinyRocket/config.mk b/flow/designs/nangate45/tinyRocket/config.mk index 02dd38d64c..d86621ba34 100644 --- a/flow/designs/nangate45/tinyRocket/config.mk +++ b/flow/designs/nangate45/tinyRocket/config.mk @@ -17,9 +17,7 @@ export SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint. export ADDITIONAL_LEFS = $(sort $(wildcard $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/*.lef)) export ADDITIONAL_LIBS = $(sort $(wildcard $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/*.lib)) - -# These values must be multiples of placement site -# x=0.19 y=1.4 -export DIE_AREA = 0 0 424.92 499.4 -export CORE_AREA = 10.07 9.8 414.85 489.6 -export TNS_END_PERCENT = 100 +export CORE_UTILIZATION = 60 +export CORE_ASPECT_RATIO = 1 +export CORE_MARGIN = 2 +export PLACE_DENSITY = 0.75 diff --git a/flow/designs/nangate45/tinyRocket/rules-base.json b/flow/designs/nangate45/tinyRocket/rules-base.json index 770e842c4f..0c8f20cd5e 100644 --- a/flow/designs/nangate45/tinyRocket/rules-base.json +++ b/flow/designs/nangate45/tinyRocket/rules-base.json @@ -1,44 +1,4 @@ { - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0075": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { "value": 59681.09, "compare": "<=" @@ -48,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 61249, + "value": 60645, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 32493, + "value": 32140, "compare": "<=" }, "detailedplace__design__violations": { @@ -60,19 +20,19 @@ "compare": "==" }, "cts__design__instance__count__setup_buffer": { - "value": 2826, + "value": 2795, "compare": "<=" }, "cts__design__instance__count__hold_buffer": { - "value": 2826, + "value": 2795, "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.103, + "value": -0.14, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -11.3, + "value": -28.1, "compare": ">=" }, "cts__timing__hold__ws": { @@ -88,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.134, + "value": -0.17, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -24.3, + "value": -44.8, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -104,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 734937, + "value": 545695, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -119,28 +79,12 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -0.0853, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -0.378, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -0.06, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -0.24, - "compare": ">=" - }, "finish__timing__setup__ws": { - "value": -0.139, + "value": -0.154, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -27.5, + "value": -40.3, "compare": ">=" }, "finish__timing__hold__ws": { @@ -152,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 63439, + "value": 62486, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/rapidus2hp/cva6/config.mk b/flow/designs/rapidus2hp/cva6/config.mk index 69447e1687..c517b6ffcd 100644 --- a/flow/designs/rapidus2hp/cva6/config.mk +++ b/flow/designs/rapidus2hp/cva6/config.mk @@ -2,6 +2,10 @@ export PLATFORM = rapidus2hp export DESIGN_NAME = cva6 +ifeq ($(FLOW_VARIANT), verific) + export SYNTH_HDL_FRONTEND = verific +endif + # Some files are listed specifically vs. sorted wilcard to control the order (makes Verific happy) export SRC_HOME = $(DESIGN_HOME)/src/$(DESIGN_NICKNAME) export VERILOG_FILES = $(sort $(wildcard $(SRC_HOME)/common/local/util/*.sv)) \ @@ -89,10 +93,38 @@ export ADDITIONAL_LIBS += $(PLATFORM_DIR)/ram/lib/sacrls0g0d1p64x128m2b1w0c1p0d0 $(PLATFORM_DIR)/ram/lib/sacrls0g0d1p64x28m2b1w0c1p0d0i0s0cr0rr0rm4rw00ms0.lib \ $(PLATFORM_DIR)/ram/lib/sacrls0g0d1p64x25m2b1w0c1p0d0i0s0cr0rr0rm4rw00ms0.lib -export SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NAME)/constraint.sdc + +DEFAULT_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint.sdc +_0P2A_6T_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint_0.2a_6T.sdc +_0P2A_8T_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint_0.2a_8T.sdc +_0P15_8T_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint_0.15_8T.sdc +_0P3_6T_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint_0.3_6T.sdc +_0P3_8T_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint_0.3_8T.sdc + +# Use $(if) to defer conditional eval until all makefiles are read +export SDC_FILE = $(strip \ + $(if $(filter 0.2a,$(RAPIDUS_PDK_VERSION)), \ + $(if $(filter ra02h138_DST_45CPP,$(PLACE_SITE)), \ + $(_0P2A_6T_SDC_FILE), \ + $(_0P2A_8T_SDC_FILE) \ + ), \ + $(if $(filter 0.15,$(RAPIDUS_PDK_VERSION)), \ + $(if $(filter ra02h184_HST_45CPP,$(PLACE_SITE)), \ + $(_0P15_8T_SDC_FILE), \ + $(DEFAULT_SDC_FILE) \ + ), \ + $(if $(filter 0.3,$(RAPIDUS_PDK_VERSION)), \ + $(if $(filter ra02h138_DST_45CPP,$(PLACE_SITE)), \ + $(_0P3_6T_SDC_FILE), \ + $(_0P3_8T_SDC_FILE) \ + ), \ + $(DEFAULT_SDC_FILE) \ + ) \ + ) \ + )) # Must be defined before the ifeq's -export SYNTH_HDL_FRONTEND = slang +export SYNTH_HDL_FRONTEND ?= slang export SYNTH_HIERARCHICAL = 1 export CORE_UTILIZATION = 65 diff --git a/flow/designs/rapidus2hp/cva6/constraint.sdc b/flow/designs/rapidus2hp/cva6/constraint.sdc index 743e092ac3..3107eb6e7c 100644 --- a/flow/designs/rapidus2hp/cva6/constraint.sdc +++ b/flow/designs/rapidus2hp/cva6/constraint.sdc @@ -1,9 +1,16 @@ # Derived from cva6_synth.tcl and Makefiles +source $::env(PLATFORM_DIR)/util.tcl + set clk_name main_clk set clk_port clk_i set clk_ports_list [list $clk_port] -set clk_period 1125 -set input_delay 0.46 -set output_delay 0.11 +set clk_period 800 + +convert_time_value clk_period + +set input_delay [convert_time_value 0.46] +set output_delay [convert_time_value 0.11] + + create_clock [get_ports $clk_port] -name $clk_name -period $clk_period diff --git a/flow/designs/rapidus2hp/cva6/constraint_demo.sdc b/flow/designs/rapidus2hp/cva6/constraint_0.15_8T.sdc similarity index 52% rename from flow/designs/rapidus2hp/cva6/constraint_demo.sdc rename to flow/designs/rapidus2hp/cva6/constraint_0.15_8T.sdc index f263502816..3b08af9063 100644 --- a/flow/designs/rapidus2hp/cva6/constraint_demo.sdc +++ b/flow/designs/rapidus2hp/cva6/constraint_0.15_8T.sdc @@ -1,9 +1,16 @@ # Derived from cva6_synth.tcl and Makefiles +source $::env(PLATFORM_DIR)/util.tcl + set clk_name main_clk set clk_port clk_i set clk_ports_list [list $clk_port] -set clk_period 1380 -set input_delay 0.46 -set output_delay 0.11 +set clk_period 650 + +convert_time_value clk_period + +set input_delay [convert_time_value 0.46] +set output_delay [convert_time_value 0.11] + + create_clock [get_ports $clk_port] -name $clk_name -period $clk_period diff --git a/flow/designs/rapidus2hp/cva6/opt_constraint.sdc b/flow/designs/rapidus2hp/cva6/constraint_0.2a_6T.sdc similarity index 52% rename from flow/designs/rapidus2hp/cva6/opt_constraint.sdc rename to flow/designs/rapidus2hp/cva6/constraint_0.2a_6T.sdc index b0692f6387..80c7cedeb4 100644 --- a/flow/designs/rapidus2hp/cva6/opt_constraint.sdc +++ b/flow/designs/rapidus2hp/cva6/constraint_0.2a_6T.sdc @@ -1,9 +1,16 @@ # Derived from cva6_synth.tcl and Makefiles +source $::env(PLATFORM_DIR)/util.tcl + set clk_name main_clk set clk_port clk_i set clk_ports_list [list $clk_port] -set clk_period 1013.87619516354 -set input_delay 0.46 -set output_delay 0.11 +set clk_period 820 + +convert_time_value clk_period + +set input_delay [convert_time_value 0.46] +set output_delay [convert_time_value 0.11] + + create_clock [get_ports $clk_port] -name $clk_name -period $clk_period diff --git a/flow/designs/rapidus2hp/cva6/constraint_0.2a_8T.sdc b/flow/designs/rapidus2hp/cva6/constraint_0.2a_8T.sdc new file mode 100644 index 0000000000..37c1b2ccd9 --- /dev/null +++ b/flow/designs/rapidus2hp/cva6/constraint_0.2a_8T.sdc @@ -0,0 +1,16 @@ +# Derived from cva6_synth.tcl and Makefiles + +source $::env(PLATFORM_DIR)/util.tcl + +set clk_name main_clk +set clk_port clk_i +set clk_ports_list [list $clk_port] +set clk_period 600 + +convert_time_value clk_period + +set input_delay [convert_time_value 0.46] +set output_delay [convert_time_value 0.11] + + +create_clock [get_ports $clk_port] -name $clk_name -period $clk_period diff --git a/flow/designs/rapidus2hp/cva6/constraint_0.3_6T.sdc b/flow/designs/rapidus2hp/cva6/constraint_0.3_6T.sdc new file mode 100644 index 0000000000..3b08af9063 --- /dev/null +++ b/flow/designs/rapidus2hp/cva6/constraint_0.3_6T.sdc @@ -0,0 +1,16 @@ +# Derived from cva6_synth.tcl and Makefiles + +source $::env(PLATFORM_DIR)/util.tcl + +set clk_name main_clk +set clk_port clk_i +set clk_ports_list [list $clk_port] +set clk_period 650 + +convert_time_value clk_period + +set input_delay [convert_time_value 0.46] +set output_delay [convert_time_value 0.11] + + +create_clock [get_ports $clk_port] -name $clk_name -period $clk_period diff --git a/flow/designs/rapidus2hp/cva6/constraint_0.3_8T.sdc b/flow/designs/rapidus2hp/cva6/constraint_0.3_8T.sdc new file mode 100644 index 0000000000..c663984bf1 --- /dev/null +++ b/flow/designs/rapidus2hp/cva6/constraint_0.3_8T.sdc @@ -0,0 +1,16 @@ +# Derived from cva6_synth.tcl and Makefiles + +source $::env(PLATFORM_DIR)/util.tcl + +set clk_name main_clk +set clk_port clk_i +set clk_ports_list [list $clk_port] +set clk_period 500 + +convert_time_value clk_period + +set input_delay [convert_time_value 0.46] +set output_delay [convert_time_value 0.11] + + +create_clock [get_ports $clk_port] -name $clk_name -period $clk_period diff --git a/flow/designs/rapidus2hp/cva6/rules-base.json b/flow/designs/rapidus2hp/cva6/rules-base.json index cf12c83e23..9a8f587748 100644 --- a/flow/designs/rapidus2hp/cva6/rules-base.json +++ b/flow/designs/rapidus2hp/cva6/rules-base.json @@ -1,126 +1,6 @@ { - "cts__flow__warnings__count:STA-0122": { - "value": 27, - "compare": "<=", - "level": "warning" - }, - "cts__flow__warnings__count:STA-1257": { - "value": 1502, - "compare": "<=", - "level": "warning" - }, - "detailedplace__flow__warnings__count:STA-1257": { - "value": 1502, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:STA-1257": { - "value": 1502, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:STA-1257": { - "value": 1502, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0256": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0279": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0280": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:STA-1257": { - "value": 1502, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:PDN-0110": { - "value": 12, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:STA-1257": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:STA-0122": { - "value": 27, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:STA-1257": { - "value": 1502, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0120": { - "value": 27, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0240": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0263": { - "value": 7, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0349": { - "value": 10, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:STA-0122": { - "value": 27, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:STA-1257": { - "value": 1502, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:STA-0122": { - "value": 27, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:STA-1257": { - "value": 1502, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { - "value": 17216.6843, + "value": 17100.0, "compare": "<=" }, "constraints__clocks__count": { @@ -128,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 14156, + "value": 14040, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 171414, + "value": 167948, "compare": "<=" }, "detailedplace__design__violations": { @@ -140,67 +20,67 @@ "compare": "==" }, "cts__design__instance__count__setup_buffer": { - "value": 14906, + "value": 14604, "compare": "<=" }, "cts__design__instance__count__hold_buffer": { - "value": 14906, + "value": 14604, "compare": "<=" }, "cts__timing__setup__ws": { - "value": -56.2, + "value": -0.114, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -225.0, + "value": -215.0, "compare": ">=" }, "cts__timing__hold__ws": { - "value": -56.2, + "value": -0.025, "compare": ">=" }, "cts__timing__hold__tns": { - "value": -225.0, + "value": -0.1, "compare": ">=" }, "globalroute__antenna_diodes_count": { - "value": 145, + "value": 143, "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -63.1, + "value": -0.186, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -245.0, + "value": -544.0, "compare": ">=" }, "globalroute__timing__hold__ws": { - "value": -63.9, + "value": -0.025, "compare": ">=" }, "globalroute__timing__hold__tns": { - "value": -262.0, + "value": -0.23, "compare": ">=" }, "finish__timing__setup__ws": { - "value": -63.1, + "value": -0.186, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -245.0, + "value": -544.0, "compare": ">=" }, "finish__timing__hold__ws": { - "value": -63.9, + "value": -0.025, "compare": ">=" }, "finish__timing__hold__tns": { - "value": -262.0, + "value": -0.23, "compare": ">=" }, "finish__design__instance__area": { - "value": 14524, + "value": 14360, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/rapidus2hp/cva6/rules-verific.json b/flow/designs/rapidus2hp/cva6/rules-verific.json new file mode 100644 index 0000000000..b867052476 --- /dev/null +++ b/flow/designs/rapidus2hp/cva6/rules-verific.json @@ -0,0 +1,86 @@ +{ + "synth__design__instance__area__stdcell": { + "value": 17200.0, + "compare": "<=" + }, + "constraints__clocks__count": { + "value": 1, + "compare": "==" + }, + "placeopt__design__instance__area": { + "value": 14318, + "compare": "<=" + }, + "placeopt__design__instance__count__stdcell": { + "value": 173997, + "compare": "<=" + }, + "detailedplace__design__violations": { + "value": 0, + "compare": "==" + }, + "cts__design__instance__count__setup_buffer": { + "value": 15130, + "compare": "<=" + }, + "cts__design__instance__count__hold_buffer": { + "value": 15130, + "compare": "<=" + }, + "cts__timing__setup__ws": { + "value": -0.148, + "compare": ">=" + }, + "cts__timing__setup__tns": { + "value": -344.0, + "compare": ">=" + }, + "cts__timing__hold__ws": { + "value": -0.025, + "compare": ">=" + }, + "cts__timing__hold__tns": { + "value": -0.1, + "compare": ">=" + }, + "globalroute__antenna_diodes_count": { + "value": 148, + "compare": "<=" + }, + "globalroute__timing__setup__ws": { + "value": -0.189, + "compare": ">=" + }, + "globalroute__timing__setup__tns": { + "value": -820.0, + "compare": ">=" + }, + "globalroute__timing__hold__ws": { + "value": -0.025, + "compare": ">=" + }, + "globalroute__timing__hold__tns": { + "value": -0.1, + "compare": ">=" + }, + "finish__timing__setup__ws": { + "value": -0.189, + "compare": ">=" + }, + "finish__timing__setup__tns": { + "value": -820.0, + "compare": ">=" + }, + "finish__timing__hold__ws": { + "value": -0.025, + "compare": ">=" + }, + "finish__timing__hold__tns": { + "value": -0.1, + "compare": ">=" + }, + "finish__design__instance__area": { + "value": 14642, + "compare": "<=" + } +} \ No newline at end of file diff --git a/flow/designs/rapidus2hp/cva6/test/test_params.py b/flow/designs/rapidus2hp/cva6/test/test_params.py new file mode 100755 index 0000000000..74639da262 --- /dev/null +++ b/flow/designs/rapidus2hp/cva6/test/test_params.py @@ -0,0 +1,141 @@ +#!/usr/bin/env python3 + +import os +import sys +import unittest + +if __name__ == "__main__": + util_dir = os.path.join( + os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), + "utils", + ) + sys.path.insert(0, util_dir) +from param_test_base import ParamTestBase + + +class TestParams(ParamTestBase): + """Unit test for checking correct Makefile settings""" + + def setUp(self): + """Sets up test variables""" + + ParamTestBase.setUp(self, "cva6") + + def get_exp_sdc(self, place_site, pdk_version): + """Returns the expected SDC file path""" + + if pdk_version in ["", "0.2a", "0.3"]: + if pdk_version == "": + pdk_version = "0.3" + if place_site == "ra02h138_DST_45CPP": + return os.path.join( + self._design_full_dir, f"constraint_{pdk_version}_6T.sdc" + ) + return os.path.join( + self._design_full_dir, f"constraint_{pdk_version}_8T.sdc" + ) + if pdk_version == "0.15" and place_site in ["", "ra02h184_HST_45CPP"]: + return os.path.join( + self._design_full_dir, f"constraint_{pdk_version}_8T.sdc" + ) + + return os.path.join(self._design_full_dir, "constraint.sdc") + + def test_pdk_0p3_default(self): + """ + Tests PDK 0.3 + """ + + pdk_version = "" + for front_end in self._front_end_list: + for place_site in self._synopsys_site_list: + exp_sdc = self.get_exp_sdc(place_site, pdk_version) + self.execute_cmd( + "SDC_FILE", + exp_sdc, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + + def test_pdk_0p2(self): + """ + Tests PDK 0.2 + """ + + pdk_version = "0.2" + for front_end in self._front_end_list: + for place_site in self._ibm_site_list: + exp_sdc = self.get_exp_sdc(place_site, pdk_version) + self.execute_cmd( + "SDC_FILE", + exp_sdc, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + + def test_pdk_0p2a(self): + """ + Tests PDK 0.2a + """ + + pdk_version = "0.2a" + for front_end in self._front_end_list: + for place_site in self._synopsys_site_list: + exp_sdc = self.get_exp_sdc(place_site, pdk_version) + self.execute_cmd( + "SDC_FILE", + exp_sdc, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + + def test_pdk_0p15(self): + """ + Tests PDK 0.15 + """ + + pdk_version = "0.15" + for front_end in self._front_end_list: + for place_site in self._synopsys_site_list: + exp_sdc = self.get_exp_sdc(place_site, pdk_version) + self.execute_cmd( + "SDC_FILE", + exp_sdc, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + + def test_pdk_0p3(self): + """ + Tests PDK 0.3 + """ + + pdk_version = "0.3" + for front_end in self._front_end_list: + for place_site in self._synopsys_site_list: + exp_sdc = self.get_exp_sdc(place_site, pdk_version) + self.execute_cmd( + "SDC_FILE", + exp_sdc, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + + def test_flow_variant(self): + """Tests that setting the flow variant uses the right frontend""" + + test_tag = "flow_variant default" + cmd = self.build_cmd("SYNTH_HDL_FRONTEND") + self.execute_cmd_int(cmd, test_tag, "slang") + test_tag = "flow_variant verific" + cmd = self.build_cmd("SYNTH_HDL_FRONTEND", flow_variant="verific") + self.execute_cmd_int(cmd, test_tag, "verific") + + +if __name__ == "__main__": + unittest.main() diff --git a/flow/designs/rapidus2hp/ethmac/config.mk b/flow/designs/rapidus2hp/ethmac/config.mk index 1aae962a76..cd2139c796 100644 --- a/flow/designs/rapidus2hp/ethmac/config.mk +++ b/flow/designs/rapidus2hp/ethmac/config.mk @@ -2,11 +2,26 @@ export PLATFORM = rapidus2hp export DESIGN_NAME = ethmac -export VERILOG_FILES = $(sort $(wildcard $(DESIGN_HOME)/src/$(DESIGN_NICKNAME)/*.v)) -export SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint.sdc +ifeq ($(FLOW_VARIANT), verific) + export SYNTH_HDL_FRONTEND = verific +endif + +export SRC_HOME = $(DESIGN_HOME)/src/$(DESIGN_NICKNAME) +export VERILOG_INCLUDE_DIRS = $(SRC_HOME) +export VERILOG_FILES = $(sort $(wildcard $(SRC_HOME)/*.v)) +export SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint.sdc export ABC_AREA = 1 -export CORE_UTILIZATION = 70 +export CORE_UTILIZATION = $(strip \ + $(if $(filter 0.15,$(RAPIDUS_PDK_VERSION)), \ + $(if $(filter ra02h138_DST_45CPP,$(PLACE_SITE)), \ + 63, \ + 65), \ + $(if $(filter 0.3,$(RAPIDUS_PDK_VERSION)), \ + 65, \ + 70) \ + )) + export CORE_ASPECT_RATIO = 1 export CORE_MARGIN = 0.75 export PLACE_DENSITY = 0.70 diff --git a/flow/designs/rapidus2hp/ethmac/constraint.sdc b/flow/designs/rapidus2hp/ethmac/constraint.sdc index b31a5f1280..72510532cb 100644 --- a/flow/designs/rapidus2hp/ethmac/constraint.sdc +++ b/flow/designs/rapidus2hp/ethmac/constraint.sdc @@ -1,7 +1,12 @@ +source $::env(PLATFORM_DIR)/util.tcl + set top_clk_name wb_clk_i set clk_period 875 set clk_io_pct 0.2 set clk_port [get_ports $top_clk_name] + +convert_time_value clk_period + create_clock -name $top_clk_name -period $clk_period $clk_port set non_clock_inputs [lsearch -inline -all -not -exact [all_inputs] $clk_port] set_input_delay [expr { $clk_period * $clk_io_pct }] -clock $top_clk_name \ @@ -12,6 +17,9 @@ set_output_delay [expr { $clk_period * $clk_io_pct }] -clock $top_clk_name \ set tx_clk_name mtx_clk_pad_i set tx_clk_port [get_ports $tx_clk_name] set tx_clk_period 300 + +convert_time_value tx_clk_period + create_clock -name $tx_clk_name -period $tx_clk_period $tx_clk_port set mtx_non_clock_inputs [lsearch -inline -all -not -exact [all_inputs] \ $tx_clk_port] @@ -23,6 +31,9 @@ set_output_delay [expr { $tx_clk_period * $clk_io_pct }] -clock $tx_clk_name \ set rx_clk_name mrx_clk_pad_i set rx_clk_port [get_ports $rx_clk_name] set rx_clk_period 110 + +convert_time_value rx_clk_period + create_clock -name $rx_clk_name -period $rx_clk_period $rx_clk_port set mrx_non_clock_inputs [lsearch -inline -all -not -exact [all_inputs] \ $rx_clk_port] diff --git a/flow/designs/rapidus2hp/ethmac/rules-base.json b/flow/designs/rapidus2hp/ethmac/rules-base.json index 062d92efb8..324893eb5d 100644 --- a/flow/designs/rapidus2hp/ethmac/rules-base.json +++ b/flow/designs/rapidus2hp/ethmac/rules-base.json @@ -1,146 +1,6 @@ { - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "cts__flow__warnings__count:STA-0122": { - "value": 27, - "compare": "<=", - "level": "warning" - }, - "cts__flow__warnings__count:STA-1257": { - "value": 1502, - "compare": "<=", - "level": "warning" - }, - "detailedplace__flow__warnings__count:STA-1257": { - "value": 1502, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:STA-1257": { - "value": 1502, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:STA-1257": { - "value": 1502, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0256": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0279": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0280": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0075": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:STA-1257": { - "value": 1502, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:GPL-0302": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:STA-1257": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:STA-0122": { - "value": 27, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:STA-1257": { - "value": 1502, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0240": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0263": { - "value": 7, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0349": { - "value": 10, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:FLW-0010": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:STA-0122": { - "value": 27, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:STA-1257": { - "value": 1502, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:STA-0122": { - "value": 27, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:STA-1257": { - "value": 1502, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { - "value": 3301.5155, + "value": 3290.0, "compare": "<=" }, "constraints__clocks__count": { @@ -148,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 3482, + "value": 4563, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 68986, + "value": 88223, "compare": "<=" }, "detailedplace__design__violations": { @@ -160,27 +20,27 @@ "compare": "==" }, "cts__design__instance__count__setup_buffer": { - "value": 5999, + "value": 5929, "compare": "<=" }, "cts__design__instance__count__hold_buffer": { - "value": 5999, + "value": 5929, "compare": "<=" }, "cts__timing__setup__ws": { - "value": -35.9, + "value": -0.0228, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -1359.48, + "value": -0.278, "compare": ">=" }, "cts__timing__hold__ws": { - "value": -5.5, + "value": -0.0055, "compare": ">=" }, "cts__timing__hold__tns": { - "value": -22.0, + "value": -0.022, "compare": ">=" }, "globalroute__antenna_diodes_count": { @@ -188,39 +48,39 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -73.9, + "value": -0.04, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -2954.232, + "value": -0.792, "compare": ">=" }, "globalroute__timing__hold__ws": { - "value": -5.5, + "value": -0.0055, "compare": ">=" }, "globalroute__timing__hold__tns": { - "value": -22.0, + "value": -0.022, "compare": ">=" }, "finish__timing__setup__ws": { - "value": -73.9, + "value": -0.04, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -2954.232, + "value": -0.792, "compare": ">=" }, "finish__timing__hold__ws": { - "value": -5.5, + "value": -0.0055, "compare": ">=" }, "finish__timing__hold__tns": { - "value": -22.0, + "value": -0.022, "compare": ">=" }, "finish__design__instance__area": { - "value": 3700, + "value": 4731, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/rapidus2hp/ethmac/rules-verific.json b/flow/designs/rapidus2hp/ethmac/rules-verific.json new file mode 100644 index 0000000000..546127d51f --- /dev/null +++ b/flow/designs/rapidus2hp/ethmac/rules-verific.json @@ -0,0 +1,86 @@ +{ + "synth__design__instance__area__stdcell": { + "value": 3290.0, + "compare": "<=" + }, + "constraints__clocks__count": { + "value": 3, + "compare": "==" + }, + "placeopt__design__instance__area": { + "value": 4537, + "compare": "<=" + }, + "placeopt__design__instance__count__stdcell": { + "value": 86838, + "compare": "<=" + }, + "detailedplace__design__violations": { + "value": 0, + "compare": "==" + }, + "cts__design__instance__count__setup_buffer": { + "value": 6307, + "compare": "<=" + }, + "cts__design__instance__count__hold_buffer": { + "value": 6307, + "compare": "<=" + }, + "cts__timing__setup__ws": { + "value": -0.0223, + "compare": ">=" + }, + "cts__timing__setup__tns": { + "value": -0.28, + "compare": ">=" + }, + "cts__timing__hold__ws": { + "value": -0.0055, + "compare": ">=" + }, + "cts__timing__hold__tns": { + "value": -0.022, + "compare": ">=" + }, + "globalroute__antenna_diodes_count": { + "value": 100, + "compare": "<=" + }, + "globalroute__timing__setup__ws": { + "value": -0.0389, + "compare": ">=" + }, + "globalroute__timing__setup__tns": { + "value": -0.738, + "compare": ">=" + }, + "globalroute__timing__hold__ws": { + "value": -0.0055, + "compare": ">=" + }, + "globalroute__timing__hold__tns": { + "value": -0.022, + "compare": ">=" + }, + "finish__timing__setup__ws": { + "value": -0.0389, + "compare": ">=" + }, + "finish__timing__setup__tns": { + "value": -0.738, + "compare": ">=" + }, + "finish__timing__hold__ws": { + "value": -0.0055, + "compare": ">=" + }, + "finish__timing__hold__tns": { + "value": -0.022, + "compare": ">=" + }, + "finish__design__instance__area": { + "value": 4707, + "compare": "<=" + } +} \ No newline at end of file diff --git a/flow/designs/rapidus2hp/ethmac/test/test_params.py b/flow/designs/rapidus2hp/ethmac/test/test_params.py new file mode 100755 index 0000000000..2c3ed37ef2 --- /dev/null +++ b/flow/designs/rapidus2hp/ethmac/test/test_params.py @@ -0,0 +1,122 @@ +#!/usr/bin/env python3 + +import os +import sys +import unittest + +if __name__ == "__main__": + util_dir = os.path.join( + os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), + "utils", + ) + sys.path.insert(0, util_dir) +from param_test_base import ParamTestBase + + +class TestParams(ParamTestBase): + """Unit test for checking correct Makefile settings""" + + def setUp(self): + """Sets up test variables""" + + ParamTestBase.setUp(self, "ethmac") + + def get_exp_util(self, place_site, pdk_version): + """Returns the expected utilization""" + + if pdk_version == "0.15": + if place_site == "ra02h138_DST_45CPP": + return 63 + return 65 + if pdk_version in ["", "0.3"]: + return 65 + return 70 + + def test_pdk_0p3_default(self): + """Tests PDK 0.3 Utilization""" + + pdk_version = "" + for front_end in self._front_end_list: + for place_site in self._synopsys_site_list: + exp_util = self.get_exp_util(place_site, pdk_version) + self.execute_cmd( + "CORE_UTILIZATION", + exp_util, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + + def test_pdk_0p2(self): + """Tests PDK 0.2 Utilization""" + + pdk_version = "0.2" + for front_end in self._front_end_list: + for place_site in self._ibm_site_list: + exp_util = self.get_exp_util(place_site, pdk_version) + self.execute_cmd( + "CORE_UTILIZATION", + exp_util, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + + def test_pdk_0p2a(self): + """Tests PDK 0.2a Utilization""" + + pdk_version = "0.2a" + for front_end in self._front_end_list: + for place_site in self._synopsys_site_list: + exp_util = self.get_exp_util(place_site, pdk_version) + self.execute_cmd( + "CORE_UTILIZATION", + exp_util, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + + def test_pdk_0p15(self): + """Tests PDK 0.15 Utilization""" + + pdk_version = "0.15" + for front_end in self._front_end_list: + for place_site in self._synopsys_site_list: + exp_util = self.get_exp_util(place_site, pdk_version) + self.execute_cmd( + "CORE_UTILIZATION", + exp_util, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + + def test_pdk_0p3(self): + """Tests PDK 0.3 Utilization""" + + pdk_version = "0.3" + for front_end in self._front_end_list: + for place_site in self._synopsys_site_list: + exp_util = self.get_exp_util(place_site, pdk_version) + self.execute_cmd( + "CORE_UTILIZATION", + exp_util, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + + def test_flow_variant(self): + """Tests that setting the flow variant uses the right frontend""" + + test_tag = "flow_variant default" + cmd = self.build_cmd("SYNTH_HDL_FRONTEND") + self.execute_cmd_int(cmd, test_tag, None) + test_tag = "flow_variant verific" + cmd = self.build_cmd("SYNTH_HDL_FRONTEND", flow_variant="verific") + self.execute_cmd_int(cmd, test_tag, "verific") + + +if __name__ == "__main__": + unittest.main() diff --git a/flow/designs/rapidus2hp/gcd/config.mk b/flow/designs/rapidus2hp/gcd/config.mk index f2ee098a1c..5e24cd8d7c 100644 --- a/flow/designs/rapidus2hp/gcd/config.mk +++ b/flow/designs/rapidus2hp/gcd/config.mk @@ -2,9 +2,31 @@ export DESIGN_NICKNAME = gcd export DESIGN_NAME = gcd export PLATFORM = rapidus2hp +ifeq ($(FLOW_VARIANT), verific) + export SYNTH_HDL_FRONTEND = verific +endif + export VERILOG_FILES = $(DESIGN_HOME)/src/$(DESIGN_NAME)/gcd.v -export SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NAME)/constraint.sdc +export SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NAME)/constraint.sdc + +# Use $(if) to defer conditional eval until all makefiles are read +# +# | PDK | Place Site | Utilization | +# | ---- | ---------- | ----------- | +# | 0.2 | 6T | 43 | +# | 0.2 | 8T | 45 | +# | 0.2a | 6T | 43 | +# | 0.2a | 8T | 45 | +# | 0.15 | 6T | 38 | +# | 0.15 | 8T | 40 | +# +export CORE_UTILIZATION = $(strip $(if $(filter 0.15,$(RAPIDUS_PDK_VERSION)), \ + $(if $(filter ra02h138_DST_45CPP,$(PLACE_SITE)), \ + 36, \ + 40), \ + $(if $(filter ra02h138_DST_45CPP SC6T,$(PLACE_SITE)), \ + 43, \ + 45))) -export CORE_UTILIZATION = 45 export CORE_MARGIN = .5 export PLACE_DENSITY = 0.42 diff --git a/flow/designs/rapidus2hp/gcd/constraint.sdc b/flow/designs/rapidus2hp/gcd/constraint.sdc index 03f95bb865..486ff7fa86 100644 --- a/flow/designs/rapidus2hp/gcd/constraint.sdc +++ b/flow/designs/rapidus2hp/gcd/constraint.sdc @@ -1,3 +1,5 @@ +source $::env(PLATFORM_DIR)/util.tcl + current_design gcd set clk_name core_clock @@ -5,6 +7,8 @@ set clk_port_name clk set clk_period 100 set clk_io_pct 0.2 +convert_time_value clk_period + set clk_port [get_ports $clk_port_name] create_clock -name $clk_name -period $clk_period $clk_port diff --git a/flow/designs/rapidus2hp/gcd/rules-base.json b/flow/designs/rapidus2hp/gcd/rules-base.json index 2327221def..15db8e0393 100644 --- a/flow/designs/rapidus2hp/gcd/rules-base.json +++ b/flow/designs/rapidus2hp/gcd/rules-base.json @@ -1,144 +1,4 @@ { - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "cts__flow__warnings__count:STA-0122": { - "value": 27, - "compare": "<=", - "level": "warning" - }, - "cts__flow__warnings__count:STA-1257": { - "value": 1502, - "compare": "<=", - "level": "warning" - }, - "detailedplace__flow__warnings__count:STA-1257": { - "value": 1502, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:STA-1257": { - "value": 1502, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:STA-1257": { - "value": 1502, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0256": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0279": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0280": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0075": { - "value": 146, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:STA-1257": { - "value": 1502, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:GPL-0302": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:STA-1257": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:GPL-0302": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:STA-0122": { - "value": 27, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:STA-1257": { - "value": 1502, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0240": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0263": { - "value": 7, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0349": { - "value": 10, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:STA-0122": { - "value": 27, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:STA-1257": { - "value": 1502, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:STA-0122": { - "value": 27, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:STA-1257": { - "value": 1502, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { "value": 20.89, "compare": "<=" @@ -152,7 +12,7 @@ "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 696, + "value": 682, "compare": "<=" }, "detailedplace__design__violations": { @@ -168,19 +28,19 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -25.4, + "value": -0.0195, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -531, + "value": -0.14, "compare": ">=" }, "cts__timing__hold__ws": { - "value": -5.0, + "value": -0.005, "compare": ">=" }, "cts__timing__hold__tns": { - "value": -20.0, + "value": -0.02, "compare": ">=" }, "globalroute__antenna_diodes_count": { @@ -188,39 +48,39 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -40.9, + "value": -0.0314, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -1124, + "value": -0.405, "compare": ">=" }, "globalroute__timing__hold__ws": { - "value": -5.0, + "value": -0.005, "compare": ">=" }, "globalroute__timing__hold__tns": { - "value": -20.0, + "value": -0.02, "compare": ">=" }, "finish__timing__setup__ws": { - "value": -40.9, + "value": -0.0314, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -1124, + "value": -0.405, "compare": ">=" }, "finish__timing__hold__ws": { - "value": -5.0, + "value": -0.005, "compare": ">=" }, "finish__timing__hold__tns": { - "value": -20.0, + "value": -0.02, "compare": ">=" }, "finish__design__instance__area": { - "value": 37, + "value": 33, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/rapidus2hp/gcd/rules-verific.json b/flow/designs/rapidus2hp/gcd/rules-verific.json new file mode 100644 index 0000000000..adeba60f64 --- /dev/null +++ b/flow/designs/rapidus2hp/gcd/rules-verific.json @@ -0,0 +1,86 @@ +{ + "synth__design__instance__area__stdcell": { + "value": 22.2, + "compare": "<=" + }, + "constraints__clocks__count": { + "value": 1, + "compare": "==" + }, + "placeopt__design__instance__area": { + "value": 29, + "compare": "<=" + }, + "placeopt__design__instance__count__stdcell": { + "value": 690, + "compare": "<=" + }, + "detailedplace__design__violations": { + "value": 0, + "compare": "==" + }, + "cts__design__instance__count__setup_buffer": { + "value": 60, + "compare": "<=" + }, + "cts__design__instance__count__hold_buffer": { + "value": 60, + "compare": "<=" + }, + "cts__timing__setup__ws": { + "value": -0.023, + "compare": ">=" + }, + "cts__timing__setup__tns": { + "value": -0.176, + "compare": ">=" + }, + "cts__timing__hold__ws": { + "value": -0.005, + "compare": ">=" + }, + "cts__timing__hold__tns": { + "value": -0.02, + "compare": ">=" + }, + "globalroute__antenna_diodes_count": { + "value": 100, + "compare": "<=" + }, + "globalroute__timing__setup__ws": { + "value": -0.0339, + "compare": ">=" + }, + "globalroute__timing__setup__tns": { + "value": -0.529, + "compare": ">=" + }, + "globalroute__timing__hold__ws": { + "value": -0.005, + "compare": ">=" + }, + "globalroute__timing__hold__tns": { + "value": -0.02, + "compare": ">=" + }, + "finish__timing__setup__ws": { + "value": -0.0339, + "compare": ">=" + }, + "finish__timing__setup__tns": { + "value": -0.529, + "compare": ">=" + }, + "finish__timing__hold__ws": { + "value": -0.005, + "compare": ">=" + }, + "finish__timing__hold__tns": { + "value": -0.02, + "compare": ">=" + }, + "finish__design__instance__area": { + "value": 31, + "compare": "<=" + } +} \ No newline at end of file diff --git a/flow/designs/rapidus2hp/gcd/test/test_params.py b/flow/designs/rapidus2hp/gcd/test/test_params.py new file mode 100755 index 0000000000..dfe28307b0 --- /dev/null +++ b/flow/designs/rapidus2hp/gcd/test/test_params.py @@ -0,0 +1,122 @@ +#!/usr/bin/env python3 + +import os +import sys +import unittest + +if __name__ == "__main__": + util_dir = os.path.join( + os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), + "utils", + ) + sys.path.insert(0, util_dir) +from param_test_base import ParamTestBase + + +class TestParams(ParamTestBase): + """Unit test for checking correct Makefile settings""" + + def setUp(self): + """Sets up test variables""" + + ParamTestBase.setUp(self, "gcd") + + def get_exp_util(self, place_site, pdk_version): + """Returns the expected value""" + + if pdk_version == "0.15": + if place_site == "ra02h138_DST_45CPP": + return 36 + return 40 + if place_site in ["SC6T", "ra02h138_DST_45CPP"]: + return 43 + return 45 + + def test_pdk_0p3_default(self): + """ + Tests PDK 0.3 utilization + """ + + pdk_version = "" + for front_end in self._front_end_list: + for place_site in self._synopsys_site_list: + exp_util = self.get_exp_util(place_site, pdk_version) + self.execute_cmd( + "CORE_UTILIZATION", + exp_util, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + + def test_pdk_0p2(self): + """ + Tests PDK 0.2 utilization + """ + + pdk_version = "0.2" + for front_end in self._front_end_list: + for place_site in self._ibm_site_list: + exp_util = self.get_exp_util(place_site, pdk_version) + self.execute_cmd( + "CORE_UTILIZATION", + exp_util, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + + def test_pdk_0p2a(self): + """ + Tests PDK 0.2a utilization + """ + + pdk_version = "0.2a" + for front_end in self._front_end_list: + for place_site in self._synopsys_site_list: + exp_util = self.get_exp_util(place_site, pdk_version) + self.execute_cmd( + "CORE_UTILIZATION", + exp_util, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + + def test_pdk_0p15(self): + """ + Tests PDK 0.15 utilization + """ + + pdk_version = "0.15" + for front_end in self._front_end_list: + for place_site in self._synopsys_site_list: + exp_util = self.get_exp_util(place_site, pdk_version) + self.execute_cmd( + "CORE_UTILIZATION", + exp_util, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + + def test_pdk_0p3(self): + """ + Tests PDK 0.3 utilization + """ + + pdk_version = "0.3" + for front_end in self._front_end_list: + for place_site in self._synopsys_site_list: + exp_util = self.get_exp_util(place_site, pdk_version) + self.execute_cmd( + "CORE_UTILIZATION", + exp_util, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + + +if __name__ == "__main__": + unittest.main() diff --git a/flow/designs/rapidus2hp/hercules_idecode/config.mk b/flow/designs/rapidus2hp/hercules_idecode/config.mk index b61cc8e3a7..4faf134625 100644 --- a/flow/designs/rapidus2hp/hercules_idecode/config.mk +++ b/flow/designs/rapidus2hp/hercules_idecode/config.mk @@ -2,6 +2,10 @@ export PLATFORM = rapidus2hp export DESIGN_NAME = hercules_idecode +ifeq ($(FLOW_VARIANT), verific) + export SYNTH_HDL_FRONTEND = verific +endif + export SRC_HOME = /platforms/Rapidus/designs/hercules_idecode export VERILOG_FILES = $(sort $(wildcard $(SRC_HOME)/hercules_idecode/verilog/*.sv)) \ $(sort $(wildcard $(SRC_HOME)/shared/verilog/*.sv)) \ @@ -14,11 +18,23 @@ export VERILOG_INCLUDE_DIRS = $(SRC_HOME)/hercules_idecode/verilog \ export SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NAME)/prects.sdc export SYNTH_HDL_FRONTEND ?= slang -ifeq ($(SYNTH_HDL_FRONTEND), slang) - export CORE_UTILIZATION = 50 -else - export CORE_UTILIZATION = 48 -endif + +# Use $(if) to defer conditional eval until all makefiles are read +# +# | Front End | Place Site | Utilization | +# | --------- | ---------- | ----------- | +# | slang | 6T | 44 | +# | slang | 8T | 50 | +# | verific | 6T | 43 | +# | verific | 8T | 48 | + +export CORE_UTILIZATION = $(strip $(if $(filter slang,$(SYNTH_HDL_FRONTEND)), \ + $(if $(filter ra02h138_DST_45CPP SC6T,$(PLACE_SITE)), \ + 44, \ + 50), \ + $(if $(filter ra02h138_DST_45CPP SC6T,$(PLACE_SITE)), \ + 43, \ + 48))) export CORE_MARGIN = 1 export PLACE_DENSITY = 0.50 @@ -29,3 +45,5 @@ export SKIP_LAST_GASP ?= 1 export CELL_PAD_IN_SITES_GLOBAL_PLACEMENT = 0 export CELL_PAD_IN_SITES_DETAIL_PLACEMENT = 0 + +export SYNTH_SLANG_ARGS = --no-implicit-memories diff --git a/flow/designs/rapidus2hp/hercules_idecode/prects.sdc b/flow/designs/rapidus2hp/hercules_idecode/prects.sdc index 81fbee7ddf..15b6a6fdf9 100755 --- a/flow/designs/rapidus2hp/hercules_idecode/prects.sdc +++ b/flow/designs/rapidus2hp/hercules_idecode/prects.sdc @@ -1,12 +1,16 @@ +source $::env(PLATFORM_DIR)/util.tcl + #set sdc_version 2.1 set sdc_version 1.4 current_design hercules_idecode set clk_period 250 +convert_time_value clk_period + set_max_fanout 32 [current_design] -set_load 10 [all_outputs] -set_max_capacitance 10 [all_inputs] +set_load [convert_cap_value 10] [all_outputs] +set_max_capacitance [convert_cap_value 10] [all_inputs] create_clock -name "clk" -add -period $clk_period \ -waveform [list 0.0 [expr 0.5*$clk_period]] [get_ports clk] diff --git a/flow/designs/rapidus2hp/hercules_idecode/rules-base.json b/flow/designs/rapidus2hp/hercules_idecode/rules-base.json index 3f4565daf8..c9d9368e99 100644 --- a/flow/designs/rapidus2hp/hercules_idecode/rules-base.json +++ b/flow/designs/rapidus2hp/hercules_idecode/rules-base.json @@ -1,151 +1,6 @@ { - "cts__flow__warnings__count:CTS-0041": { - "value": 4, - "compare": "<=", - "level": "warning" - }, - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "cts__flow__warnings__count:RSZ-0066": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "cts__flow__warnings__count:STA-0122": { - "value": 27, - "compare": "<=", - "level": "warning" - }, - "cts__flow__warnings__count:STA-1257": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "detailedplace__flow__warnings__count:STA-1257": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:STA-1257": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:STA-1257": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0256": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0279": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0280": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:STA-1257": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:GPL-0302": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:STA-1257": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:GRT-0115": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:STA-0122": { - "value": 27, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:STA-1257": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0240": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0263": { - "value": 7, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0349": { - "value": 10, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0066": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:STA-0122": { - "value": 27, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:STA-1257": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:STA-0122": { - "value": 27, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:STA-1257": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { - "value": 8732.47, + "value": 8720.0, "compare": "<=" }, "constraints__clocks__count": { @@ -153,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 12538, + "value": 11599, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 314731, + "value": 296166, "compare": "<=" }, "detailedplace__design__violations": { @@ -165,27 +20,27 @@ "compare": "==" }, "cts__design__instance__count__setup_buffer": { - "value": 27368, + "value": 25754, "compare": "<=" }, "cts__design__instance__count__hold_buffer": { - "value": 27368, + "value": 25754, "compare": "<=" }, "cts__timing__setup__ws": { - "value": -212.0, + "value": -0.0472, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -1020000.0, + "value": -45.3, "compare": ">=" }, "cts__timing__hold__ws": { - "value": -17.9, + "value": -0.0125, "compare": ">=" }, "cts__timing__hold__tns": { - "value": -64.2, + "value": -0.05, "compare": ">=" }, "globalroute__antenna_diodes_count": { @@ -193,39 +48,39 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -340.0, + "value": -0.0811, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -607000.0, + "value": -176.0, "compare": ">=" }, "globalroute__timing__hold__ws": { - "value": -12.5, + "value": -0.0125, "compare": ">=" }, "globalroute__timing__hold__tns": { - "value": -50.0, + "value": -0.05, "compare": ">=" }, "finish__timing__setup__ws": { - "value": -340.0, + "value": -0.0811, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -607000.0, + "value": -176.0, "compare": ">=" }, "finish__timing__hold__ws": { - "value": -12.5, + "value": -0.0125, "compare": ">=" }, "finish__timing__hold__tns": { - "value": -50.0, + "value": -0.05, "compare": ">=" }, "finish__design__instance__area": { - "value": 12810, + "value": 11865, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/rapidus2hp/hercules_idecode/rules-verific.json b/flow/designs/rapidus2hp/hercules_idecode/rules-verific.json new file mode 100644 index 0000000000..3be7653d95 --- /dev/null +++ b/flow/designs/rapidus2hp/hercules_idecode/rules-verific.json @@ -0,0 +1,86 @@ +{ + "synth__design__instance__area__stdcell": { + "value": 8680.0, + "compare": "<=" + }, + "constraints__clocks__count": { + "value": 1, + "compare": "==" + }, + "placeopt__design__instance__area": { + "value": 11625, + "compare": "<=" + }, + "placeopt__design__instance__count__stdcell": { + "value": 298408, + "compare": "<=" + }, + "detailedplace__design__violations": { + "value": 0, + "compare": "==" + }, + "cts__design__instance__count__setup_buffer": { + "value": 25948, + "compare": "<=" + }, + "cts__design__instance__count__hold_buffer": { + "value": 25948, + "compare": "<=" + }, + "cts__timing__setup__ws": { + "value": -0.0229, + "compare": ">=" + }, + "cts__timing__setup__tns": { + "value": -6.74, + "compare": ">=" + }, + "cts__timing__hold__ws": { + "value": -0.0125, + "compare": ">=" + }, + "cts__timing__hold__tns": { + "value": -0.05, + "compare": ">=" + }, + "globalroute__antenna_diodes_count": { + "value": 259, + "compare": "<=" + }, + "globalroute__timing__setup__ws": { + "value": -0.0661, + "compare": ">=" + }, + "globalroute__timing__setup__tns": { + "value": -197.0, + "compare": ">=" + }, + "globalroute__timing__hold__ws": { + "value": -0.0125, + "compare": ">=" + }, + "globalroute__timing__hold__tns": { + "value": -0.05, + "compare": ">=" + }, + "finish__timing__setup__ws": { + "value": -0.0661, + "compare": ">=" + }, + "finish__timing__setup__tns": { + "value": -197.0, + "compare": ">=" + }, + "finish__timing__hold__ws": { + "value": -0.0125, + "compare": ">=" + }, + "finish__timing__hold__tns": { + "value": -0.05, + "compare": ">=" + }, + "finish__design__instance__area": { + "value": 11884, + "compare": "<=" + } +} \ No newline at end of file diff --git a/flow/designs/rapidus2hp/hercules_idecode/test/test_params.py b/flow/designs/rapidus2hp/hercules_idecode/test/test_params.py new file mode 100755 index 0000000000..25a812a563 --- /dev/null +++ b/flow/designs/rapidus2hp/hercules_idecode/test/test_params.py @@ -0,0 +1,133 @@ +#!/usr/bin/env python3 + +import os +import sys +import unittest + +if __name__ == "__main__": + util_dir = os.path.join( + os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), + "utils", + ) + sys.path.insert(0, util_dir) +from param_test_base import ParamTestBase + + +class TestParams(ParamTestBase): + """Unit test for checking correct Makefile settings""" + + def setUp(self): + """Sets up test variables""" + + ParamTestBase.setUp(self, "hercules_idecode") + + def get_exp_util(self, place_site, front_end): + """Returns the expected value""" + + if front_end == "verific": + if place_site in ["SC6T", "ra02h138_DST_45CPP"]: + return 43 + return 48 + else: + if place_site in ["SC6T", "ra02h138_DST_45CPP"]: + return 44 + return 50 + + def test_pdk_0p3_default(self): + """ + Tests PDK 0.3 utilization + """ + + pdk_version = "" + for front_end in self._front_end_list: + for place_site in self._synopsys_site_list: + exp_util = self.get_exp_util(place_site, front_end) + self.execute_cmd( + "CORE_UTILIZATION", + exp_util, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + + def test_pdk_0p2(self): + """ + Tests PDK 0.2 utilization + """ + + pdk_version = "0.2" + for front_end in self._front_end_list: + for place_site in self._ibm_site_list: + exp_util = self.get_exp_util(place_site, front_end) + self.execute_cmd( + "CORE_UTILIZATION", + exp_util, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + + def test_pdk_0p2a(self): + """ + Tests PDK 0.2a utilization + """ + + pdk_version = "0.2a" + for front_end in self._front_end_list: + for place_site in self._synopsys_site_list: + exp_util = self.get_exp_util(place_site, front_end) + self.execute_cmd( + "CORE_UTILIZATION", + exp_util, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + + def test_pdk_0p15(self): + """ + Tests PDK 0.15 utilization + """ + + pdk_version = "0.15" + for front_end in self._front_end_list: + for place_site in self._synopsys_site_list: + exp_util = self.get_exp_util(place_site, front_end) + self.execute_cmd( + "CORE_UTILIZATION", + exp_util, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + + def test_pdk_0p3(self): + """ + Tests PDK 0.3 utilization + """ + + pdk_version = "0.3" + for front_end in self._front_end_list: + for place_site in self._synopsys_site_list: + exp_util = self.get_exp_util(place_site, front_end) + self.execute_cmd( + "CORE_UTILIZATION", + exp_util, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + + def test_flow_variant(self): + """Tests that setting the flow variant uses the right frontend""" + + test_tag = "flow_variant default" + cmd = self.build_cmd("SYNTH_HDL_FRONTEND") + self.execute_cmd_int(cmd, test_tag, "slang") + test_tag = "flow_variant verific" + cmd = self.build_cmd("SYNTH_HDL_FRONTEND", flow_variant="verific") + self.execute_cmd_int(cmd, test_tag, "verific") + + +if __name__ == "__main__": + unittest.main() diff --git a/flow/designs/rapidus2hp/hercules_is_int/config.mk b/flow/designs/rapidus2hp/hercules_is_int/config.mk index 6f50ed2160..a23252e545 100644 --- a/flow/designs/rapidus2hp/hercules_is_int/config.mk +++ b/flow/designs/rapidus2hp/hercules_is_int/config.mk @@ -8,6 +8,10 @@ ifeq ($(FLOW_VARIANT), gatelevel) export SYNTH_NETLIST_FILES = $(SRC_HOME)/ca78_8t_postroute_0707.v endif +ifeq ($(FLOW_VARIANT), verific) + export SYNTH_HDL_FRONTEND = verific +endif + export VERILOG_FILES = $(sort $(wildcard $(SRC_HOME)/hercules_issue/verilog/*.sv)) \ $(sort $(wildcard $(SRC_HOME)/shared/verilog/*.sv)) \ $(sort $(wildcard $(SRC_HOME)/models/cells/generic/*.sv)) @@ -22,15 +26,30 @@ export SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NAME)/prects export SYNTH_HDL_FRONTEND ?= slang export SYNTH_HIERARCHICAL ?= 0 -ifeq ($(PLACE_SITE), SC6T) - export CORE_UTILIZATION = 30 -else - ifeq ($(SYNTH_HDL_FRONTEND), slang) - export CORE_UTILIZATION = 52 - else - export CORE_UTILIZATION = 54 - endif -endif +# Use $(if) to defer conditional eval until all makefiles are read +# +# | PDK Version | Front End | Place Site | Utilization | +# | ------------| --------- | ---------- | ----------- | +# | all | slang | 6T | 30 | +# | non-0.3 | slang | 8T | 52 | +# | all | verific | 6T | 30 | +# | non-0.3 | verific | 8T | 54 | +# | 0.3 | any | 8T | 56 | + +export CORE_UTILIZATION = $(strip \ + $(if $(filter 0.3,$(RAPIDUS_PDK_VERSION)), \ + 56, \ + $(if $(filter slang,$(SYNTH_HDL_FRONTEND)), \ + $(if $(filter ra02h138_DST_45CPP SC6T,$(PLACE_SITE)), \ + 30, \ + 52 \ + ), \ + $(if $(filter ra02h138_DST_45CPP SC6T,$(PLACE_SITE)), \ + 30, \ + 54 \ + ) \ + ) \ + )) export CORE_MARGIN = 1 export PLACE_DENSITY = 0.58 diff --git a/flow/designs/rapidus2hp/hercules_is_int/prects.sdc b/flow/designs/rapidus2hp/hercules_is_int/prects.sdc index 934de6be54..51ed806dd5 100644 --- a/flow/designs/rapidus2hp/hercules_is_int/prects.sdc +++ b/flow/designs/rapidus2hp/hercules_is_int/prects.sdc @@ -1,12 +1,16 @@ +source $::env(PLATFORM_DIR)/util.tcl + #set sdc_version 2.1 set sdc_version 1.4 current_design hercules_is_int set clk_period 250 +convert_time_value clk_period + set_max_fanout 32 [current_design] -set_load 10 [all_outputs] -set_max_capacitance 10 [all_inputs] +set_load [convert_cap_value 10] [all_outputs] +set_max_capacitance [convert_cap_value 10] [all_inputs] create_clock -name "clk" -add -period $clk_period \ -waveform [list 0.0 [expr { 0.5 * $clk_period }]] [get_ports clk] diff --git a/flow/designs/rapidus2hp/hercules_is_int/prects_prop.sdc b/flow/designs/rapidus2hp/hercules_is_int/prects_prop.sdc index acdd9ba08c..60e7b5814f 100644 --- a/flow/designs/rapidus2hp/hercules_is_int/prects_prop.sdc +++ b/flow/designs/rapidus2hp/hercules_is_int/prects_prop.sdc @@ -1,12 +1,16 @@ +source $::env(PLATFORM_DIR)/util.tcl + #set sdc_version 2.1 set sdc_version 1.4 current_design hercules_is_int set clk_period 250 +convert_time_value clk_period + set_max_fanout 32 [current_design] -set_load 10 [all_outputs] -set_max_capacitance 10 [all_inputs] +set_load [convert_cap_value 10] [all_outputs] +set_max_capacitance [convert_cap_value 10] [all_inputs] create_clock -name "clk" -add -period $clk_period \ -waveform [list 0.0 [expr { 0.5 * $clk_period }]] [get_ports clk] diff --git a/flow/designs/rapidus2hp/hercules_is_int/rules-base.json b/flow/designs/rapidus2hp/hercules_is_int/rules-base.json index 92c9989424..a1b0565a73 100644 --- a/flow/designs/rapidus2hp/hercules_is_int/rules-base.json +++ b/flow/designs/rapidus2hp/hercules_is_int/rules-base.json @@ -1,131 +1,6 @@ { - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "cts__flow__warnings__count:STA-0122": { - "value": 27, - "compare": "<=", - "level": "warning" - }, - "cts__flow__warnings__count:STA-1257": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "detailedplace__flow__warnings__count:STA-1257": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:STA-1257": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:STA-1257": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0256": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0279": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0280": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:STA-1257": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:STA-1257": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:STA-0122": { - "value": 27, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:STA-1257": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0240": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0263": { - "value": 7, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0349": { - "value": 10, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0066": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:STA-0122": { - "value": 27, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:STA-1257": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:STA-0122": { - "value": 27, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:STA-1257": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { - "value": 26631.02, + "value": 26600.0, "compare": "<=" }, "constraints__clocks__count": { @@ -133,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 34339, + "value": 31739, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 747172, + "value": 658787, "compare": "<=" }, "detailedplace__design__violations": { @@ -145,67 +20,67 @@ "compare": "==" }, "cts__design__instance__count__setup_buffer": { - "value": 64972, + "value": 57286, "compare": "<=" }, "cts__design__instance__count__hold_buffer": { - "value": 64972, + "value": 57286, "compare": "<=" }, "cts__timing__setup__ws": { - "value": -390.0, + "value": -0.0333, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -3510000.0, + "value": -63.8, "compare": ">=" }, "cts__timing__hold__ws": { - "value": -12.5, + "value": -0.0125, "compare": ">=" }, "cts__timing__hold__tns": { - "value": -50.0, + "value": -0.05, "compare": ">=" }, "globalroute__antenna_diodes_count": { - "value": 652, + "value": 579, "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -316.0, + "value": -0.12, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -2040000.0, + "value": -1160.0, "compare": ">=" }, "globalroute__timing__hold__ws": { - "value": -55.5, + "value": -0.0125, "compare": ">=" }, "globalroute__timing__hold__tns": { - "value": -484.0, + "value": -0.05, "compare": ">=" }, "finish__timing__setup__ws": { - "value": -316.0, + "value": -0.12, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -2040000.0, + "value": -1160.0, "compare": ">=" }, "finish__timing__hold__ws": { - "value": -55.5, + "value": -0.0125, "compare": ">=" }, "finish__timing__hold__tns": { - "value": -484.0, + "value": -0.05, "compare": ">=" }, "finish__design__instance__area": { - "value": 35285, + "value": 33275, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/rapidus2hp/hercules_is_int/rules-verific.json b/flow/designs/rapidus2hp/hercules_is_int/rules-verific.json new file mode 100644 index 0000000000..f754b07bde --- /dev/null +++ b/flow/designs/rapidus2hp/hercules_is_int/rules-verific.json @@ -0,0 +1,86 @@ +{ + "synth__design__instance__area__stdcell": { + "value": 26600.0, + "compare": "<=" + }, + "constraints__clocks__count": { + "value": 1, + "compare": "==" + }, + "placeopt__design__instance__area": { + "value": 31868, + "compare": "<=" + }, + "placeopt__design__instance__count__stdcell": { + "value": 659181, + "compare": "<=" + }, + "detailedplace__design__violations": { + "value": 0, + "compare": "==" + }, + "cts__design__instance__count__setup_buffer": { + "value": 57320, + "compare": "<=" + }, + "cts__design__instance__count__hold_buffer": { + "value": 57320, + "compare": "<=" + }, + "cts__timing__setup__ws": { + "value": -0.0441, + "compare": ">=" + }, + "cts__timing__setup__tns": { + "value": -77.5, + "compare": ">=" + }, + "cts__timing__hold__ws": { + "value": -0.0125, + "compare": ">=" + }, + "cts__timing__hold__tns": { + "value": -0.05, + "compare": ">=" + }, + "globalroute__antenna_diodes_count": { + "value": 579, + "compare": "<=" + }, + "globalroute__timing__setup__ws": { + "value": -0.118, + "compare": ">=" + }, + "globalroute__timing__setup__tns": { + "value": -1300.0, + "compare": ">=" + }, + "globalroute__timing__hold__ws": { + "value": -0.0125, + "compare": ">=" + }, + "globalroute__timing__hold__tns": { + "value": -0.05, + "compare": ">=" + }, + "finish__timing__setup__ws": { + "value": -0.118, + "compare": ">=" + }, + "finish__timing__setup__tns": { + "value": -1300.0, + "compare": ">=" + }, + "finish__timing__hold__ws": { + "value": -0.0125, + "compare": ">=" + }, + "finish__timing__hold__tns": { + "value": -0.05, + "compare": ">=" + }, + "finish__design__instance__area": { + "value": 33377, + "compare": "<=" + } +} \ No newline at end of file diff --git a/flow/designs/rapidus2hp/hercules_is_int/test/test_params.py b/flow/designs/rapidus2hp/hercules_is_int/test/test_params.py new file mode 100755 index 0000000000..a1b8330b9a --- /dev/null +++ b/flow/designs/rapidus2hp/hercules_is_int/test/test_params.py @@ -0,0 +1,135 @@ +#!/usr/bin/env python3 + +import os +import sys +import unittest + +if __name__ == "__main__": + util_dir = os.path.join( + os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), + "utils", + ) + sys.path.insert(0, util_dir) +from param_test_base import ParamTestBase + + +class TestParams(ParamTestBase): + """Unit test for checking correct Makefile settings""" + + def setUp(self): + """Sets up test variables""" + + ParamTestBase.setUp(self, "hercules_is_int") + + def get_exp_util(self, place_site, front_end, pdk_version): + """Returns the expected value""" + + if pdk_version in ["", "0.3"]: + return 56 + if front_end == "verific": + if place_site in ["SC6T", "ra02h138_DST_45CPP"]: + return 30 + return 54 + else: + if place_site in ["SC6T", "ra02h138_DST_45CPP"]: + return 30 + return 52 + + def test_pdk_0p3_default(self): + """ + Tests PDK 0.3 utilization + """ + + pdk_version = "" + for front_end in self._front_end_list: + for place_site in self._synopsys_site_list: + exp_util = self.get_exp_util(place_site, front_end, pdk_version) + self.execute_cmd( + "CORE_UTILIZATION", + exp_util, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + + def test_pdk_0p2(self): + """ + Tests PDK 0.2 utilization + """ + + pdk_version = "0.2" + for front_end in self._front_end_list: + for place_site in self._ibm_site_list: + exp_util = self.get_exp_util(place_site, front_end, pdk_version) + self.execute_cmd( + "CORE_UTILIZATION", + exp_util, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + + def test_pdk_0p2a(self): + """ + Tests PDK 0.2a utilization + """ + + pdk_version = "0.2a" + for front_end in self._front_end_list: + for place_site in self._synopsys_site_list: + exp_util = self.get_exp_util(place_site, front_end, pdk_version) + self.execute_cmd( + "CORE_UTILIZATION", + exp_util, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + + def test_pdk_0p15(self): + """ + Tests PDK 0.15 utilization + """ + + pdk_version = "0.15" + for front_end in self._front_end_list: + for place_site in self._synopsys_site_list: + exp_util = self.get_exp_util(place_site, front_end, pdk_version) + self.execute_cmd( + "CORE_UTILIZATION", + exp_util, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + + def test_pdk_0p3(self): + """ + Tests PDK 0.3 utilization + """ + + pdk_version = "0.3" + for front_end in self._front_end_list: + for place_site in self._synopsys_site_list: + exp_util = self.get_exp_util(place_site, front_end, pdk_version) + self.execute_cmd( + "CORE_UTILIZATION", + exp_util, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + + def test_flow_variant(self): + """Tests that setting the flow variant uses the right frontend""" + + test_tag = "flow_variant default" + cmd = self.build_cmd("SYNTH_HDL_FRONTEND") + self.execute_cmd_int(cmd, test_tag, "slang") + test_tag = "flow_variant verific" + cmd = self.build_cmd("SYNTH_HDL_FRONTEND", flow_variant="verific") + self.execute_cmd_int(cmd, test_tag, "verific") + + +if __name__ == "__main__": + unittest.main() diff --git a/flow/designs/rapidus2hp/ibex/config.mk b/flow/designs/rapidus2hp/ibex/config.mk index 6aaa7a6122..3a1b18e49e 100644 --- a/flow/designs/rapidus2hp/ibex/config.mk +++ b/flow/designs/rapidus2hp/ibex/config.mk @@ -3,23 +3,68 @@ export PLATFORM = rapidus2hp export DESIGN_NICKNAME = ibex export DESIGN_NAME = ibex_core -export VERILOG_FILES = $(sort $(wildcard $(DESIGN_HOME)/src/ibex_sv/*.sv)) \ +ifeq ($(FLOW_VARIANT), verific) + export SYNTH_HDL_FRONTEND = verific +endif + +export VERILOG_FILES = \ + $(DESIGN_HOME)/src/ibex_sv/ibex_pkg.sv \ + $(sort $(filter-out %/ibex_pkg.sv, $(wildcard $(DESIGN_HOME)/src/ibex_sv/*.sv))) \ $(DESIGN_HOME)/src/ibex_sv/syn/rtl/prim_clock_gating.v export VERILOG_INCLUDE_DIRS = \ $(DESIGN_HOME)/src/ibex_sv/vendor/lowrisc_ip/prim/rtl/ -export SYNTH_HDL_FRONTEND = slang +export SYNTH_HDL_FRONTEND ?= slang + # if FLOW_VARIANT == pos_slack, use an SDC file that has a larger clock # resulting in positive slack ifeq ($(FLOW_VARIANT),pos_slack) export SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint_pos_slack.sdc else -export SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint.sdc + DEFAULT_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint.sdc + _0P2A_6T_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint_0.2a_6T.sdc + _0P2A_8T_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint_0.2a_8T.sdc + _0P15_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint_0.15.sdc + _0P3_6T_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint_0.3_6T.sdc + _0P3_8T_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint_0.3_8T.sdc + + # Use $(if) to defer conditional eval until all makefiles are read + export SDC_FILE = $(strip \ + $(if $(filter 0.2a,$(RAPIDUS_PDK_VERSION)), \ + $(if $(filter ra02h138_DST_45CPP,$(PLACE_SITE)), \ + $(_0P2A_6T_SDC_FILE), \ + $(_0P2A_8T_SDC_FILE) \ + ), \ + $(if $(filter 0.15,$(RAPIDUS_PDK_VERSION)), \ + $(_0P15_SDC_FILE), \ + $(if $(filter 0.3,$(RAPIDUS_PDK_VERSION)), \ + $(if $(filter ra02h138_DST_45CPP,$(PLACE_SITE)), \ + $(_0P3_6T_SDC_FILE), \ + $(_0P3_8T_SDC_FILE) \ + ), \ + $(DEFAULT_SDC_FILE) \ + ) \ + ) \ + )) endif -export CORE_UTILIZATION = 70 +export CORE_UTILIZATION = $(strip \ + $(if $(filter 0.15,$(RAPIDUS_PDK_VERSION)), \ + $(if $(filter ra02h138_DST_45CPP,$(PLACE_SITE)), \ + 52, \ + 65 \ + ), \ + $(if $(filter 0.3,$(RAPIDUS_PDK_VERSION)), \ + $(if $(filter ra02h138_DST_45CPP,$(PLACE_SITE)), \ + 60, \ + 65 \ + ), \ + 70 \ + ) \ + )) + export CORE_ASPECT_RATIO = 1 export CORE_MARGIN = 0.75 export PLACE_DENSITY_LB_ADDON = 0.20 diff --git a/flow/designs/rapidus2hp/ibex/constraint.sdc b/flow/designs/rapidus2hp/ibex/constraint.sdc index e697ef2300..26620f6aee 100644 --- a/flow/designs/rapidus2hp/ibex/constraint.sdc +++ b/flow/designs/rapidus2hp/ibex/constraint.sdc @@ -1,3 +1,5 @@ +source $::env(PLATFORM_DIR)/util.tcl + set clk_name core_clock set clk_port_name clk_i set clk_period 590 @@ -5,6 +7,8 @@ set clk_io_pct 0.2 set clk_port [get_ports $clk_port_name] +convert_time_value clk_period + create_clock -name $clk_name -period $clk_period $clk_port set non_clock_inputs [lsearch -inline -all -not -exact [all_inputs] $clk_port] diff --git a/flow/designs/rapidus2hp/ibex/constraint_0.15.sdc b/flow/designs/rapidus2hp/ibex/constraint_0.15.sdc new file mode 100644 index 0000000000..f539d55b82 --- /dev/null +++ b/flow/designs/rapidus2hp/ibex/constraint_0.15.sdc @@ -0,0 +1,19 @@ +source $::env(PLATFORM_DIR)/util.tcl + +set clk_name core_clock +set clk_port_name clk_i +set clk_period 450 +set clk_io_pct 0.2 + +set clk_port [get_ports $clk_port_name] + +convert_time_value clk_period + +create_clock -name $clk_name -period $clk_period $clk_port + +set non_clock_inputs [lsearch -inline -all -not -exact [all_inputs] $clk_port] + +set_input_delay [expr { $clk_period * $clk_io_pct }] -clock $clk_name \ + $non_clock_inputs +set_output_delay [expr { $clk_period * $clk_io_pct }] -clock $clk_name \ + [all_outputs] diff --git a/flow/designs/rapidus2hp/ibex/constraint_0.2a_6T.sdc b/flow/designs/rapidus2hp/ibex/constraint_0.2a_6T.sdc new file mode 100644 index 0000000000..471590ee50 --- /dev/null +++ b/flow/designs/rapidus2hp/ibex/constraint_0.2a_6T.sdc @@ -0,0 +1,19 @@ +source $::env(PLATFORM_DIR)/util.tcl + +set clk_name core_clock +set clk_port_name clk_i +set clk_period 730 +set clk_io_pct 0.2 + +set clk_port [get_ports $clk_port_name] + +convert_time_value clk_period + +create_clock -name $clk_name -period $clk_period $clk_port + +set non_clock_inputs [lsearch -inline -all -not -exact [all_inputs] $clk_port] + +set_input_delay [expr { $clk_period * $clk_io_pct }] -clock $clk_name \ + $non_clock_inputs +set_output_delay [expr { $clk_period * $clk_io_pct }] -clock $clk_name \ + [all_outputs] diff --git a/flow/designs/rapidus2hp/ibex/constraint_0.2a_8T.sdc b/flow/designs/rapidus2hp/ibex/constraint_0.2a_8T.sdc new file mode 100644 index 0000000000..ab67202b80 --- /dev/null +++ b/flow/designs/rapidus2hp/ibex/constraint_0.2a_8T.sdc @@ -0,0 +1,19 @@ +source $::env(PLATFORM_DIR)/util.tcl + +set clk_name core_clock +set clk_port_name clk_i +set clk_period 480 +set clk_io_pct 0.2 + +set clk_port [get_ports $clk_port_name] + +convert_time_value clk_period + +create_clock -name $clk_name -period $clk_period $clk_port + +set non_clock_inputs [lsearch -inline -all -not -exact [all_inputs] $clk_port] + +set_input_delay [expr { $clk_period * $clk_io_pct }] -clock $clk_name \ + $non_clock_inputs +set_output_delay [expr { $clk_period * $clk_io_pct }] -clock $clk_name \ + [all_outputs] diff --git a/flow/designs/rapidus2hp/ibex/constraint_0.3_6T.sdc b/flow/designs/rapidus2hp/ibex/constraint_0.3_6T.sdc new file mode 100644 index 0000000000..bdece50956 --- /dev/null +++ b/flow/designs/rapidus2hp/ibex/constraint_0.3_6T.sdc @@ -0,0 +1,19 @@ +source $::env(PLATFORM_DIR)/util.tcl + +set clk_name core_clock +set clk_port_name clk_i +set clk_period 550 +set clk_io_pct 0.2 + +set clk_port [get_ports $clk_port_name] + +convert_time_value clk_period + +create_clock -name $clk_name -period $clk_period $clk_port + +set non_clock_inputs [lsearch -inline -all -not -exact [all_inputs] $clk_port] + +set_input_delay [expr { $clk_period * $clk_io_pct }] -clock $clk_name \ + $non_clock_inputs +set_output_delay [expr { $clk_period * $clk_io_pct }] -clock $clk_name \ + [all_outputs] diff --git a/flow/designs/rapidus2hp/ibex/constraint_0.3_8T.sdc b/flow/designs/rapidus2hp/ibex/constraint_0.3_8T.sdc new file mode 100644 index 0000000000..f539d55b82 --- /dev/null +++ b/flow/designs/rapidus2hp/ibex/constraint_0.3_8T.sdc @@ -0,0 +1,19 @@ +source $::env(PLATFORM_DIR)/util.tcl + +set clk_name core_clock +set clk_port_name clk_i +set clk_period 450 +set clk_io_pct 0.2 + +set clk_port [get_ports $clk_port_name] + +convert_time_value clk_period + +create_clock -name $clk_name -period $clk_period $clk_port + +set non_clock_inputs [lsearch -inline -all -not -exact [all_inputs] $clk_port] + +set_input_delay [expr { $clk_period * $clk_io_pct }] -clock $clk_name \ + $non_clock_inputs +set_output_delay [expr { $clk_period * $clk_io_pct }] -clock $clk_name \ + [all_outputs] diff --git a/flow/designs/rapidus2hp/ibex/constraint_pos_slack.sdc b/flow/designs/rapidus2hp/ibex/constraint_pos_slack.sdc index d714d428ae..6226d2121c 100644 --- a/flow/designs/rapidus2hp/ibex/constraint_pos_slack.sdc +++ b/flow/designs/rapidus2hp/ibex/constraint_pos_slack.sdc @@ -1,8 +1,12 @@ +source $::env(PLATFORM_DIR)/util.tcl + set clk_name core_clock set clk_port_name clk_i set clk_period 1468 set clk_io_pct 0.2 +convert_time_value clk_period + set clk_port [get_ports $clk_port_name] create_clock -name $clk_name -period $clk_period $clk_port diff --git a/flow/designs/rapidus2hp/ibex/rules-base.json b/flow/designs/rapidus2hp/ibex/rules-base.json index 7f027ea048..9e7564b3de 100644 --- a/flow/designs/rapidus2hp/ibex/rules-base.json +++ b/flow/designs/rapidus2hp/ibex/rules-base.json @@ -1,116 +1,6 @@ { - "cts__flow__warnings__count:STA-0122": { - "value": 27, - "compare": "<=", - "level": "warning" - }, - "cts__flow__warnings__count:STA-1257": { - "value": 1502, - "compare": "<=", - "level": "warning" - }, - "detailedplace__flow__warnings__count:STA-1257": { - "value": 1502, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:STA-1257": { - "value": 1502, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:STA-1257": { - "value": 1502, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0256": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0279": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0280": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:STA-1257": { - "value": 1502, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:STA-1257": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:STA-0122": { - "value": 27, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:STA-1257": { - "value": 1502, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0240": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0263": { - "value": 7, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0349": { - "value": 10, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:STA-0122": { - "value": 27, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:STA-1257": { - "value": 1502, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:STA-0122": { - "value": 27, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:STA-1257": { - "value": 1502, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { - "value": 1020.31, + "value": 1020.0, "compare": "<=" }, "constraints__clocks__count": { @@ -118,7 +8,7 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 1060, + "value": 1049, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { @@ -138,19 +28,19 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -29.5, + "value": -0.0225, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -118.0, + "value": -0.09, "compare": ">=" }, "cts__timing__hold__ws": { - "value": -29.5, + "value": -0.0225, "compare": ">=" }, "cts__timing__hold__tns": { - "value": -118.0, + "value": -0.09, "compare": ">=" }, "globalroute__antenna_diodes_count": { @@ -158,39 +48,39 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -98.4, + "value": -0.0254, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -15900.0, + "value": -0.0963, "compare": ">=" }, "globalroute__timing__hold__ws": { - "value": -29.5, + "value": -0.0225, "compare": ">=" }, "globalroute__timing__hold__tns": { - "value": -118.0, + "value": -0.09, "compare": ">=" }, "finish__timing__setup__ws": { - "value": -98.4, + "value": -0.0254, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -15900.0, + "value": -0.0963, "compare": ">=" }, "finish__timing__hold__ws": { - "value": -29.5, + "value": -0.0225, "compare": ">=" }, "finish__timing__hold__tns": { - "value": -118.0, + "value": -0.09, "compare": ">=" }, "finish__design__instance__area": { - "value": 1105, + "value": 1088, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/rapidus2hp/ibex/rules-verific.json b/flow/designs/rapidus2hp/ibex/rules-verific.json new file mode 100644 index 0000000000..d69e039649 --- /dev/null +++ b/flow/designs/rapidus2hp/ibex/rules-verific.json @@ -0,0 +1,86 @@ +{ + "synth__design__instance__area__stdcell": { + "value": 1030.0, + "compare": "<=" + }, + "constraints__clocks__count": { + "value": 1, + "compare": "==" + }, + "placeopt__design__instance__area": { + "value": 1060, + "compare": "<=" + }, + "placeopt__design__instance__count__stdcell": { + "value": 23391, + "compare": "<=" + }, + "detailedplace__design__violations": { + "value": 0, + "compare": "==" + }, + "cts__design__instance__count__setup_buffer": { + "value": 1760, + "compare": "<=" + }, + "cts__design__instance__count__hold_buffer": { + "value": 1760, + "compare": "<=" + }, + "cts__timing__setup__ws": { + "value": -0.0225, + "compare": ">=" + }, + "cts__timing__setup__tns": { + "value": -0.09, + "compare": ">=" + }, + "cts__timing__hold__ws": { + "value": -0.0225, + "compare": ">=" + }, + "cts__timing__hold__tns": { + "value": -0.09, + "compare": ">=" + }, + "globalroute__antenna_diodes_count": { + "value": 100, + "compare": "<=" + }, + "globalroute__timing__setup__ws": { + "value": -0.0265, + "compare": ">=" + }, + "globalroute__timing__setup__tns": { + "value": -0.236, + "compare": ">=" + }, + "globalroute__timing__hold__ws": { + "value": -0.0225, + "compare": ">=" + }, + "globalroute__timing__hold__tns": { + "value": -0.09, + "compare": ">=" + }, + "finish__timing__setup__ws": { + "value": -0.0265, + "compare": ">=" + }, + "finish__timing__setup__tns": { + "value": -0.236, + "compare": ">=" + }, + "finish__timing__hold__ws": { + "value": -0.0225, + "compare": ">=" + }, + "finish__timing__hold__tns": { + "value": -0.09, + "compare": ">=" + }, + "finish__design__instance__area": { + "value": 1103, + "compare": "<=" + } +} \ No newline at end of file diff --git a/flow/designs/rapidus2hp/ibex/test/test_params.py b/flow/designs/rapidus2hp/ibex/test/test_params.py new file mode 100755 index 0000000000..9953c62ccd --- /dev/null +++ b/flow/designs/rapidus2hp/ibex/test/test_params.py @@ -0,0 +1,201 @@ +#!/usr/bin/env python3 + +import os +import sys +import unittest + +if __name__ == "__main__": + util_dir = os.path.join( + os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), + "utils", + ) + sys.path.insert(0, util_dir) +from param_test_base import ParamTestBase + + +class TestParams(ParamTestBase): + """Unit test for checking correct Makefile settings""" + + def setUp(self): + """Sets up test variables""" + + ParamTestBase.setUp(self, "ibex") + + def get_exp_util(self, place_site, pdk_version): + """Returns the expected utilization""" + + if pdk_version in ["", "0.3"]: + if place_site == "ra02h138_DST_45CPP": + return 60 + return 65 + if pdk_version == "0.15": + if place_site == "ra02h138_DST_45CPP": + return 52 + return 65 + return 70 + + def get_exp_sdc(self, place_site, pdk_version): + """Returns the expected SDC file path""" + + if pdk_version == "0.2a": + if place_site == "ra02h138_DST_45CPP": + return os.path.join( + self._design_full_dir, f"constraint_{pdk_version}_6T.sdc" + ) + return os.path.join( + self._design_full_dir, f"constraint_{pdk_version}_8T.sdc" + ) + if pdk_version == "0.15": + return os.path.join(self._design_full_dir, f"constraint_{pdk_version}.sdc") + if pdk_version in ["", "0.3"]: + if pdk_version == "": + pdk_version = "0.3" + if place_site == "ra02h138_DST_45CPP": + return os.path.join( + self._design_full_dir, f"constraint_{pdk_version}_6T.sdc" + ) + return os.path.join( + self._design_full_dir, f"constraint_{pdk_version}_8T.sdc" + ) + + return os.path.join(self._design_full_dir, "constraint.sdc") + + def test_pdk_0p3_default(self): + """ + Tests PDK 0.3 utilization + """ + + pdk_version = "" + for front_end in self._front_end_list: + for place_site in self._synopsys_site_list: + exp_util = self.get_exp_util(place_site, pdk_version) + exp_sdc = self.get_exp_sdc(place_site, pdk_version) + self.execute_cmd( + "CORE_UTILIZATION", + exp_util, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + self.execute_cmd( + "SDC_FILE", + exp_sdc, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + + def test_pdk_0p2(self): + """ + Tests PDK 0.2 utilization + """ + + pdk_version = "0.2" + for front_end in self._front_end_list: + for place_site in self._ibm_site_list: + exp_util = self.get_exp_util(place_site, pdk_version) + exp_sdc = self.get_exp_sdc(place_site, pdk_version) + self.execute_cmd( + "CORE_UTILIZATION", + exp_util, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + self.execute_cmd( + "SDC_FILE", + exp_sdc, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + + def test_pdk_0p2a(self): + """ + Tests PDK 0.2a utilization + """ + + pdk_version = "0.2a" + for front_end in self._front_end_list: + for place_site in self._synopsys_site_list: + exp_util = self.get_exp_util(place_site, pdk_version) + exp_sdc = self.get_exp_sdc(place_site, pdk_version) + self.execute_cmd( + "CORE_UTILIZATION", + exp_util, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + self.execute_cmd( + "SDC_FILE", + exp_sdc, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + + def test_pdk_0p15(self): + """ + Tests PDK 0.15 utilization + """ + + pdk_version = "0.15" + for front_end in self._front_end_list: + for place_site in self._synopsys_site_list: + exp_util = self.get_exp_util(place_site, pdk_version) + exp_sdc = self.get_exp_sdc(place_site, pdk_version) + self.execute_cmd( + "CORE_UTILIZATION", + exp_util, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + self.execute_cmd( + "SDC_FILE", + exp_sdc, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + + def test_pdk_0p3(self): + """ + Tests PDK 0.3 utilization + """ + + front_end = "" + pdk_version = "0.3" + for front_end in self._front_end_list: + for place_site in self._synopsys_site_list: + exp_util = self.get_exp_util(place_site, pdk_version) + exp_sdc = self.get_exp_sdc(place_site, pdk_version) + self.execute_cmd( + "CORE_UTILIZATION", + exp_util, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + self.execute_cmd( + "SDC_FILE", + exp_sdc, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + + def test_flow_variant(self): + """Tests that setting the flow variant uses the right frontend""" + + test_tag = "flow_variant default" + cmd = self.build_cmd("SYNTH_HDL_FRONTEND") + self.execute_cmd_int(cmd, test_tag, "slang") + test_tag = "flow_variant verific" + cmd = self.build_cmd("SYNTH_HDL_FRONTEND", flow_variant="verific") + self.execute_cmd_int(cmd, test_tag, "verific") + + +if __name__ == "__main__": + unittest.main() diff --git a/flow/designs/rapidus2hp/jpeg/config.mk b/flow/designs/rapidus2hp/jpeg/config.mk index e270e5c3a6..54c251dbf8 100644 --- a/flow/designs/rapidus2hp/jpeg/config.mk +++ b/flow/designs/rapidus2hp/jpeg/config.mk @@ -3,9 +3,35 @@ export PLATFORM = rapidus2hp export DESIGN_NAME = jpeg_encoder export DESIGN_NICKNAME = jpeg +ifeq ($(FLOW_VARIANT), verific) + export SYNTH_HDL_FRONTEND = verific +endif + export VERILOG_FILES = $(sort $(wildcard $(DESIGN_HOME)/src/$(DESIGN_NICKNAME)/*.v)) export VERILOG_INCLUDE_DIRS = $(DESIGN_HOME)/src/$(DESIGN_NICKNAME)/include -export SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/jpeg_encoder15_7nm.sdc + +DEFAULT_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/jpeg_encoder15_7nm.sdc +_0P2A_8T_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/jpeg_encoder15_0.2a_8T.sdc +_0P15_6T_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/jpeg_encoder15_0.15_6T.sdc +_0P15_8T_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/jpeg_encoder15_0.15_8T.sdc +_0P3_SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/jpeg_encoder15_0.3.sdc + +# Use $(if) to defer conditional eval until all makefiles are read +export SDC_FILE = $(strip \ + $(if $(and $(filter 0.2a,$(RAPIDUS_PDK_VERSION)),$(filter ra02h184_HST_45CPP,$(PLACE_SITE))), \ + $(_0P2A_8T_SDC_FILE), \ + $(if $(filter 0.15,$(RAPIDUS_PDK_VERSION)), \ + $(if $(filter ra02h138_DST_45CPP,$(PLACE_SITE)), \ + $(_0P15_6T_SDC_FILE), \ + $(_0P15_8T_SDC_FILE) \ + ), \ + $(if $(filter 0.3,$(RAPIDUS_PDK_VERSION)), \ + $(_0P3_SDC_FILE), \ + $(DEFAULT_SDC_FILE) \ + ) \ + ) \ + )) + export ABC_AREA = 1 export CORE_UTILIZATION = 60 diff --git a/flow/designs/rapidus2hp/jpeg/jpeg_encoder15_0.15.sdc b/flow/designs/rapidus2hp/jpeg/jpeg_encoder15_0.15.sdc new file mode 100644 index 0000000000..9687665247 --- /dev/null +++ b/flow/designs/rapidus2hp/jpeg/jpeg_encoder15_0.15.sdc @@ -0,0 +1,21 @@ +source $::env(PLATFORM_DIR)/util.tcl + +current_design jpeg_encoder + +set clk_name clk +set clk_port_name clk +set clk_period 300 +set clk_io_pct 0.2 + +convert_time_value clk_period + +set clk_port [get_ports $clk_port_name] + +create_clock -name $clk_name -period $clk_period $clk_port + +set non_clock_inputs [lsearch -inline -all -not -exact [all_inputs] $clk_port] + +set_input_delay [expr { $clk_period * $clk_io_pct }] -clock $clk_name \ + $non_clock_inputs +set_output_delay [expr { $clk_period * $clk_io_pct }] -clock $clk_name \ + [all_outputs] diff --git a/flow/designs/rapidus2hp/jpeg/jpeg_encoder15_0.15_6T.sdc b/flow/designs/rapidus2hp/jpeg/jpeg_encoder15_0.15_6T.sdc new file mode 100644 index 0000000000..3263c5e01a --- /dev/null +++ b/flow/designs/rapidus2hp/jpeg/jpeg_encoder15_0.15_6T.sdc @@ -0,0 +1,21 @@ +source $::env(PLATFORM_DIR)/util.tcl + +current_design jpeg_encoder + +set clk_name clk +set clk_port_name clk +set clk_period 150 +set clk_io_pct 0.2 + +convert_time_value clk_period + +set clk_port [get_ports $clk_port_name] + +create_clock -name $clk_name -period $clk_period $clk_port + +set non_clock_inputs [lsearch -inline -all -not -exact [all_inputs] $clk_port] + +set_input_delay [expr { $clk_period * $clk_io_pct }] -clock $clk_name \ + $non_clock_inputs +set_output_delay [expr { $clk_period * $clk_io_pct }] -clock $clk_name \ + [all_outputs] diff --git a/flow/designs/rapidus2hp/jpeg/jpeg_encoder15_0.15_8T.sdc b/flow/designs/rapidus2hp/jpeg/jpeg_encoder15_0.15_8T.sdc new file mode 100644 index 0000000000..b8396d16eb --- /dev/null +++ b/flow/designs/rapidus2hp/jpeg/jpeg_encoder15_0.15_8T.sdc @@ -0,0 +1,21 @@ +source $::env(PLATFORM_DIR)/util.tcl + +current_design jpeg_encoder + +set clk_name clk +set clk_port_name clk +set clk_period 250 +set clk_io_pct 0.2 + +convert_time_value clk_period + +set clk_port [get_ports $clk_port_name] + +create_clock -name $clk_name -period $clk_period $clk_port + +set non_clock_inputs [lsearch -inline -all -not -exact [all_inputs] $clk_port] + +set_input_delay [expr { $clk_period * $clk_io_pct }] -clock $clk_name \ + $non_clock_inputs +set_output_delay [expr { $clk_period * $clk_io_pct }] -clock $clk_name \ + [all_outputs] diff --git a/flow/designs/rapidus2hp/jpeg/jpeg_encoder15_0.2a_8T.sdc b/flow/designs/rapidus2hp/jpeg/jpeg_encoder15_0.2a_8T.sdc new file mode 100644 index 0000000000..ea07db329e --- /dev/null +++ b/flow/designs/rapidus2hp/jpeg/jpeg_encoder15_0.2a_8T.sdc @@ -0,0 +1,21 @@ +source $::env(PLATFORM_DIR)/util.tcl + +current_design jpeg_encoder + +set clk_name clk +set clk_port_name clk +set clk_period 265 +set clk_io_pct 0.2 + +convert_time_value clk_period + +set clk_port [get_ports $clk_port_name] + +create_clock -name $clk_name -period $clk_period $clk_port + +set non_clock_inputs [lsearch -inline -all -not -exact [all_inputs] $clk_port] + +set_input_delay [expr { $clk_period * $clk_io_pct }] -clock $clk_name \ + $non_clock_inputs +set_output_delay [expr { $clk_period * $clk_io_pct }] -clock $clk_name \ + [all_outputs] diff --git a/flow/designs/rapidus2hp/jpeg/jpeg_encoder15_0.3.sdc b/flow/designs/rapidus2hp/jpeg/jpeg_encoder15_0.3.sdc new file mode 100644 index 0000000000..3263c5e01a --- /dev/null +++ b/flow/designs/rapidus2hp/jpeg/jpeg_encoder15_0.3.sdc @@ -0,0 +1,21 @@ +source $::env(PLATFORM_DIR)/util.tcl + +current_design jpeg_encoder + +set clk_name clk +set clk_port_name clk +set clk_period 150 +set clk_io_pct 0.2 + +convert_time_value clk_period + +set clk_port [get_ports $clk_port_name] + +create_clock -name $clk_name -period $clk_period $clk_port + +set non_clock_inputs [lsearch -inline -all -not -exact [all_inputs] $clk_port] + +set_input_delay [expr { $clk_period * $clk_io_pct }] -clock $clk_name \ + $non_clock_inputs +set_output_delay [expr { $clk_period * $clk_io_pct }] -clock $clk_name \ + [all_outputs] diff --git a/flow/designs/rapidus2hp/jpeg/jpeg_encoder15_7nm.sdc b/flow/designs/rapidus2hp/jpeg/jpeg_encoder15_7nm.sdc index 9f0d6c6a9b..43391b7424 100644 --- a/flow/designs/rapidus2hp/jpeg/jpeg_encoder15_7nm.sdc +++ b/flow/designs/rapidus2hp/jpeg/jpeg_encoder15_7nm.sdc @@ -1,3 +1,5 @@ +source $::env(PLATFORM_DIR)/util.tcl + current_design jpeg_encoder set clk_name clk @@ -5,6 +7,8 @@ set clk_port_name clk set clk_period 425 set clk_io_pct 0.2 +convert_time_value clk_period + set clk_port [get_ports $clk_port_name] create_clock -name $clk_name -period $clk_period $clk_port diff --git a/flow/designs/rapidus2hp/jpeg/rules-base.json b/flow/designs/rapidus2hp/jpeg/rules-base.json index 4c785cf45a..4af3c87f90 100644 --- a/flow/designs/rapidus2hp/jpeg/rules-base.json +++ b/flow/designs/rapidus2hp/jpeg/rules-base.json @@ -1,114 +1,4 @@ { - "cts__flow__warnings__count:STA-0122": { - "value": 27, - "compare": "<=", - "level": "warning" - }, - "cts__flow__warnings__count:STA-1257": { - "value": 1502, - "compare": "<=", - "level": "warning" - }, - "detailedplace__flow__warnings__count:STA-1257": { - "value": 1502, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:STA-1257": { - "value": 1502, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:STA-1257": { - "value": 1502, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0256": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0279": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0280": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:STA-1257": { - "value": 1502, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:STA-1257": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:STA-0122": { - "value": 27, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:STA-1257": { - "value": 1502, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0240": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0263": { - "value": 7, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0349": { - "value": 10, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:GRT-0246": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:STA-0122": { - "value": 27, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:STA-1257": { - "value": 1502, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:STA-0122": { - "value": 27, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:STA-1257": { - "value": 1502, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { "value": 3197.7067, "compare": "<=" @@ -118,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 3326, + "value": 3936, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 97540, + "value": 116278, "compare": "<=" }, "detailedplace__design__violations": { @@ -138,19 +28,19 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -21.2, + "value": -0.0432, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -85.0, + "value": -29.2, "compare": ">=" }, "cts__timing__hold__ws": { - "value": -21.2, + "value": -0.0075, "compare": ">=" }, "cts__timing__hold__tns": { - "value": -85.0, + "value": -0.03, "compare": ">=" }, "globalroute__antenna_diodes_count": { @@ -158,39 +48,39 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -68.7, + "value": -0.0952, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -24191, + "value": -142.0, "compare": ">=" }, "globalroute__timing__hold__ws": { - "value": -21.2, + "value": -0.0075, "compare": ">=" }, "globalroute__timing__hold__tns": { - "value": -85.0, + "value": -0.03, "compare": ">=" }, "finish__timing__setup__ws": { - "value": -68.7, + "value": -0.0952, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -24191, + "value": -142.0, "compare": ">=" }, "finish__timing__hold__ws": { - "value": -21.2, + "value": -0.0075, "compare": ">=" }, "finish__timing__hold__tns": { - "value": -85.0, + "value": -0.03, "compare": ">=" }, "finish__design__instance__area": { - "value": 3438, + "value": 4037, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/rapidus2hp/jpeg/rules-verific.json b/flow/designs/rapidus2hp/jpeg/rules-verific.json new file mode 100644 index 0000000000..6dd3abb241 --- /dev/null +++ b/flow/designs/rapidus2hp/jpeg/rules-verific.json @@ -0,0 +1,86 @@ +{ + "synth__design__instance__area__stdcell": { + "value": 3290.0, + "compare": "<=" + }, + "constraints__clocks__count": { + "value": 1, + "compare": "==" + }, + "placeopt__design__instance__area": { + "value": 3950, + "compare": "<=" + }, + "placeopt__design__instance__count__stdcell": { + "value": 117602, + "compare": "<=" + }, + "detailedplace__design__violations": { + "value": 0, + "compare": "==" + }, + "cts__design__instance__count__setup_buffer": { + "value": 8644, + "compare": "<=" + }, + "cts__design__instance__count__hold_buffer": { + "value": 8644, + "compare": "<=" + }, + "cts__timing__setup__ws": { + "value": -0.0529, + "compare": ">=" + }, + "cts__timing__setup__tns": { + "value": -30.9, + "compare": ">=" + }, + "cts__timing__hold__ws": { + "value": -0.0075, + "compare": ">=" + }, + "cts__timing__hold__tns": { + "value": -0.03, + "compare": ">=" + }, + "globalroute__antenna_diodes_count": { + "value": 100, + "compare": "<=" + }, + "globalroute__timing__setup__ws": { + "value": -0.092, + "compare": ">=" + }, + "globalroute__timing__setup__tns": { + "value": -126.0, + "compare": ">=" + }, + "globalroute__timing__hold__ws": { + "value": -0.0075, + "compare": ">=" + }, + "globalroute__timing__hold__tns": { + "value": -0.03, + "compare": ">=" + }, + "finish__timing__setup__ws": { + "value": -0.092, + "compare": ">=" + }, + "finish__timing__setup__tns": { + "value": -126.0, + "compare": ">=" + }, + "finish__timing__hold__ws": { + "value": -0.0075, + "compare": ">=" + }, + "finish__timing__hold__tns": { + "value": -0.03, + "compare": ">=" + }, + "finish__design__instance__area": { + "value": 4048, + "compare": "<=" + } +} \ No newline at end of file diff --git a/flow/designs/rapidus2hp/jpeg/test/test_params.py b/flow/designs/rapidus2hp/jpeg/test/test_params.py new file mode 100755 index 0000000000..b04eed5eab --- /dev/null +++ b/flow/designs/rapidus2hp/jpeg/test/test_params.py @@ -0,0 +1,145 @@ +#!/usr/bin/env python3 + +import os +import sys +import unittest + +if __name__ == "__main__": + util_dir = os.path.join( + os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), + "utils", + ) + sys.path.insert(0, util_dir) +from param_test_base import ParamTestBase + + +class TestParams(ParamTestBase): + """Unit test for checking correct Makefile settings""" + + def setUp(self): + """Sets up test variables""" + + ParamTestBase.setUp(self, "jpeg") + + def get_exp_sdc(self, place_site, pdk_version): + """Returns the expected SDC file path""" + + if pdk_version == "0.2a": + if place_site in ["", "ra02h184_HST_45CPP"]: + return os.path.join( + self._design_full_dir, f"jpeg_encoder15_{pdk_version}_8T.sdc" + ) + if pdk_version == "0.15": + if place_site in ["", "ra02h184_HST_45CPP"]: + return os.path.join( + self._design_full_dir, f"jpeg_encoder15_{pdk_version}_8T.sdc" + ) + return os.path.join( + self._design_full_dir, f"jpeg_encoder15_{pdk_version}_6T.sdc" + ) + if pdk_version in ["", "0.3"]: + if pdk_version == "": + pdk_version = "0.3" + return os.path.join( + self._design_full_dir, f"jpeg_encoder15_{pdk_version}.sdc" + ) + return os.path.join(self._design_full_dir, "jpeg_encoder15_7nm.sdc") + + def test_pdk_0p3_default(self): + """ + Tests PDK 0.3 utilization + """ + + pdk_version = "" + for front_end in self._front_end_list: + for place_site in self._synopsys_site_list: + exp_sdc = self.get_exp_sdc(place_site, pdk_version) + self.execute_cmd( + "SDC_FILE", + exp_sdc, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + + def test_pdk_0p2(self): + """ + Tests PDK 0.2 utilization + """ + + pdk_version = "0.2" + for front_end in self._front_end_list: + for place_site in self._ibm_site_list: + exp_sdc = self.get_exp_sdc(place_site, pdk_version) + self.execute_cmd( + "SDC_FILE", + exp_sdc, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + + def test_pdk_0p2a(self): + """ + Tests PDK 0.2a utilization + """ + + pdk_version = "0.2a" + for front_end in self._front_end_list: + for place_site in self._synopsys_site_list: + exp_sdc = self.get_exp_sdc(place_site, pdk_version) + self.execute_cmd( + "SDC_FILE", + exp_sdc, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + + def test_pdk_0p15(self): + """ + Tests PDK 0.15 utilization + """ + + pdk_version = "0.15" + for front_end in self._front_end_list: + for place_site in self._synopsys_site_list: + exp_sdc = self.get_exp_sdc(place_site, pdk_version) + self.execute_cmd( + "SDC_FILE", + exp_sdc, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + + def test_pdk_0p3(self): + """ + Tests PDK 0.3 utilization + """ + + pdk_version = "0.3" + for front_end in self._front_end_list: + for place_site in self._synopsys_site_list: + exp_sdc = self.get_exp_sdc(place_site, pdk_version) + self.execute_cmd( + "SDC_FILE", + exp_sdc, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + + def test_flow_variant(self): + """Tests that setting the flow variant uses the right frontend""" + + test_tag = "flow_variant default" + cmd = self.build_cmd("SYNTH_HDL_FRONTEND") + self.execute_cmd_int(cmd, test_tag, None) + test_tag = "flow_variant verific" + cmd = self.build_cmd("SYNTH_HDL_FRONTEND", flow_variant="verific") + self.execute_cmd_int(cmd, test_tag, "verific") + + +if __name__ == "__main__": + unittest.main() diff --git a/flow/designs/rapidus2hp/utils/param_test_base.py b/flow/designs/rapidus2hp/utils/param_test_base.py new file mode 100644 index 0000000000..d171e10518 --- /dev/null +++ b/flow/designs/rapidus2hp/utils/param_test_base.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python3 + +import os +import re +import subprocess +import unittest + + +class ParamTestBase(unittest.TestCase): + """Base class for testing params""" + + def setUp(self, design_name): + """ + Sets up common member variables. + Assumes we're running in flow directory + """ + + self._platform = "rapidus2hp" + self._design = design_name + self._design_dir = os.path.join("designs", self._platform, self._design) + self._cmd_base = f"make DESIGN_CONFIG={self._design_dir}/config.mk" + self._design_full_dir = os.path.join(os.getcwd(), self._design_dir) + # Handle different make output + # param: value + # param = value + self._result_re = re.compile(r"\S+\s*(?:=|:)\s*(\S+)?") + self._front_end_list = ["", "slang", "verific"] + self._ibm_site_list = ["", "SC6T", "SC8T"] + self._synopsys_site_list = ["", "ra02h138_DST_45CPP", "ra02h184_HST_45CPP"] + + def get_track_height(self, place_site): + """Returns the track height for the place site""" + + if place_site.startswith("SC"): + return place_site[2:] + if place_site == "ra02h138_DST_45CPP": + return "6T" + return "8T" + + def build_cmd( + self, + param_name, + place_site=None, + pdk_version=None, + front_end=None, + flow_variant=None, + ): + """Builds the command to execute""" + + str_buf = [self._cmd_base] + if place_site and place_site != "": + str_buf.append(f"PLACE_SITE={place_site}") + if pdk_version and pdk_version != "": + str_buf.append(f"RAPIDUS_PDK_VERSION={pdk_version}") + if front_end and front_end == "verific": + str_buf.append(f"SYNTH_HDL_FRONTEND={front_end}") + if flow_variant and flow_variant != "": + str_buf.append(f"FLOW_VARIANT={flow_variant}") + str_buf.append(f"print-{param_name}") + return " ".join(str_buf) + + def execute_cmd( + self, + param_name, + exp_result, + place_site=None, + pdk_version=None, + front_end=None, + debug=False, + ): + """ + Executes command + """ + + test_tag = f"'{place_site}' '{pdk_version}' '{front_end}'" + cmd = self.build_cmd( + param_name, + place_site=place_site, + pdk_version=pdk_version, + front_end=front_end, + ) + if debug: + print(cmd) + self.execute_cmd_int(cmd, test_tag, exp_result) + + def execute_cmd_int(self, cmd, test_tag, exp_result): + """ + Executes command + check if return code is 0 + check if value matches expected result + """ + + out = subprocess.run( + cmd, check=True, shell=True, capture_output=True, text=True + ) + self.assertEqual(out.returncode, 0, f"Return code for {test_tag} is non-zero") + stdout_str = out.stdout.rstrip() + result = self._result_re.match(stdout_str) + self.assertIsNotNone(result, f"RE result {test_tag} is None") + value = result.group(1) + if isinstance(exp_result, int): + value = int(value) + self.assertEqual(value, exp_result, f"Results for {test_tag} don't match") diff --git a/flow/designs/rapidus2hp/utils/run_tests.sh b/flow/designs/rapidus2hp/utils/run_tests.sh new file mode 100755 index 0000000000..f9e1207745 --- /dev/null +++ b/flow/designs/rapidus2hp/utils/run_tests.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +err_ct=0 + +for design_name in cva6 ethmac gcd hercules_idecode hercules_is_int ibex jpeg; do + ./designs/rapidus2hp/$design_name/test/test_params.py + if [ $? -ne 0 ]; then + ((err_ct++)) + fi +done + +if [ $err_ct -ne 0 ]; then + echo "ERROR: $err_ct errors found" + exit 1 +fi + +exit 0 diff --git a/flow/designs/sky130hd/aes/config.mk b/flow/designs/sky130hd/aes/config.mk index 85b0da73d6..c82a295d40 100644 --- a/flow/designs/sky130hd/aes/config.mk +++ b/flow/designs/sky130hd/aes/config.mk @@ -20,3 +20,6 @@ export REMOVE_ABC_BUFFERS = 1 export CTS_CLUSTER_SIZE = 20 export CTS_CLUSTER_DIAMETER = 50 + +export SWAP_ARITH_OPERATORS = 1 +export OPENROAD_HIERARCHICAL = 1 diff --git a/flow/designs/sky130hd/aes/rules-base.json b/flow/designs/sky130hd/aes/rules-base.json index 246b465db1..4ab859b230 100644 --- a/flow/designs/sky130hd/aes/rules-base.json +++ b/flow/designs/sky130hd/aes/rules-base.json @@ -1,31 +1,6 @@ { - "detailedroute__flow__warnings__count:DRT-0349": { - "value": 10, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0349": { - "value": 10, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { - "value": 99830.94, + "value": 87900.0, "compare": "<=" }, "constraints__clocks__count": { @@ -33,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 136403, + "value": 130193, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 23636, + "value": 22298, "compare": "<=" }, "detailedplace__design__violations": { @@ -73,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.272, + "value": -0.225, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -1.0, + "value": -0.9, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -89,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 961372, + "value": 802985, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -104,22 +79,6 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -0.225, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -0.9, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -0.225, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -0.9, - "compare": ">=" - }, "finish__timing__setup__ws": { "value": -0.225, "compare": ">=" @@ -137,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 141950, + "value": 135288, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/sky130hd/chameleon/rules-base.json b/flow/designs/sky130hd/chameleon/rules-base.json index babe031688..28a018f4a6 100644 --- a/flow/designs/sky130hd/chameleon/rules-base.json +++ b/flow/designs/sky130hd/chameleon/rules-base.json @@ -1,54 +1,4 @@ { - "detailedroute__flow__warnings__count:DRT-0349": { - "value": 10, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:GRT-0243": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0220": { - "value": 4, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ORD-2011": { - "value": 4, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:PDN-0110": { - "value": 2, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0349": { - "value": 10, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:GRT-0243": { - "value": 2, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { "value": 27373.26, "compare": "<=" @@ -94,7 +44,7 @@ "compare": ">=" }, "globalroute__antenna_diodes_count": { - "value": 232, + "value": 105, "compare": "<=" }, "globalroute__timing__setup__ws": { @@ -114,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 784325, + "value": 771372, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -129,22 +79,6 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -0.35, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -1.4, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -0.35, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -1.4, - "compare": ">=" - }, "finish__timing__setup__ws": { "value": -0.35, "compare": ">=" @@ -162,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 6532057, + "value": 6531862, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/sky130hd/gcd/rules-base.json b/flow/designs/sky130hd/gcd/rules-base.json index 849724e2bd..1421149341 100644 --- a/flow/designs/sky130hd/gcd/rules-base.json +++ b/flow/designs/sky130hd/gcd/rules-base.json @@ -1,49 +1,4 @@ { - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:DRT-0349": { - "value": 10, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0075": { - "value": 939, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0349": { - "value": 10, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { "value": 2760.0, "compare": "<=" @@ -53,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 4271, + "value": 4161, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 519, + "value": 506, "compare": "<=" }, "detailedplace__design__violations": { @@ -65,7 +20,7 @@ "compare": "==" }, "cts__design__instance__count__setup_buffer": { - "value": 46, + "value": 44, "compare": "<=" }, "cts__design__instance__count__hold_buffer": { @@ -73,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -2.45, + "value": -2.27, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -125.0, + "value": -94.8, "compare": ">=" }, "cts__timing__hold__ws": { @@ -93,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -2.66, + "value": -2.43, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -130.0, + "value": -110.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -109,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 9675, + "value": 8413, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -124,28 +79,12 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -2.2, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -106.0, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -0.055, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -0.22, - "compare": ">=" - }, "finish__timing__setup__ws": { - "value": -2.51, + "value": -2.29, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -122.0, + "value": -95.5, "compare": ">=" }, "finish__timing__hold__ws": { @@ -157,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 5494, + "value": 5056, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/sky130hd/ibex/config.mk b/flow/designs/sky130hd/ibex/config.mk index 5f03b5aae7..e05fdfbbaf 100644 --- a/flow/designs/sky130hd/ibex/config.mk +++ b/flow/designs/sky130hd/ibex/config.mk @@ -25,3 +25,6 @@ export REMOVE_ABC_BUFFERS = 1 export CTS_CLUSTER_SIZE = 20 export CTS_CLUSTER_DIAMETER = 50 + +export SWAP_ARITH_OPERATORS = 1 +export OPENROAD_HIERARCHICAL = 1 diff --git a/flow/designs/sky130hd/ibex/rules-base.json b/flow/designs/sky130hd/ibex/rules-base.json index 9a753c0380..595e1fde89 100644 --- a/flow/designs/sky130hd/ibex/rules-base.json +++ b/flow/designs/sky130hd/ibex/rules-base.json @@ -1,46 +1,6 @@ { - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:DRT-0120": { - "value": 24, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:DRT-0349": { - "value": 10, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0120": { - "value": 6, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0349": { - "value": 10, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { - "value": 153658.0, + "value": 148000.0, "compare": "<=" }, "constraints__clocks__count": { @@ -48,7 +8,7 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 171628, + "value": 169126, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { @@ -68,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.683, + "value": -0.533, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -3.56, + "value": -2.05, "compare": ">=" }, "cts__timing__hold__ws": { @@ -88,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.926, + "value": -0.783, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -9.3, + "value": -3.63, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -104,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 752600, + "value": 749863, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -119,28 +79,12 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -0.5, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -2.0, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -0.5, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -2.0, - "compare": ">=" - }, "finish__timing__setup__ws": { - "value": -0.768, + "value": -0.631, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -4.54, + "value": -2.13, "compare": ">=" }, "finish__timing__hold__ws": { @@ -152,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 187501, + "value": 180708, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/sky130hd/jpeg/rules-base.json b/flow/designs/sky130hd/jpeg/rules-base.json index d24108ab8a..5ccdcc00ab 100644 --- a/flow/designs/sky130hd/jpeg/rules-base.json +++ b/flow/designs/sky130hd/jpeg/rules-base.json @@ -1,49 +1,4 @@ { - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:DRT-0120": { - "value": 63, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:DRT-0349": { - "value": 10, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:GRT-0115": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0120": { - "value": 21, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0349": { - "value": 10, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { "value": 463729.45, "compare": "<=" @@ -73,7 +28,7 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.321, + "value": -0.309, "compare": ">=" }, "cts__timing__setup__tns": { @@ -89,15 +44,15 @@ "compare": ">=" }, "globalroute__antenna_diodes_count": { - "value": 100, + "value": 102, "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.477, + "value": -0.414, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -20.8, + "value": -6.89, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -121,25 +76,9 @@ "compare": "<=" }, "detailedroute__antenna_diodes_count": { - "value": 102, + "value": 131, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -0.275, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -1.1, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -0.275, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -1.1, - "compare": ">=" - }, "finish__timing__setup__ws": { "value": -0.275, "compare": ">=" diff --git a/flow/designs/sky130hd/microwatt/README.md b/flow/designs/sky130hd/microwatt/README.md new file mode 100644 index 0000000000..ecfe109b2a --- /dev/null +++ b/flow/designs/sky130hd/microwatt/README.md @@ -0,0 +1,190 @@ +# Mocking vs fake memories + +Configuring fake memories for this design would speed up the ORFS flow and increase accuracy of results, but some effort is required. Two methods for learning something about a design without setting up SRAM are explained here. + +## Synthesis with large flip flop memories + +By default `SYNTH_MEMORY_MAX_BITS=42000` since no fake memories have been configured for this example design. This is simple, but results in slow builds and unrealistically large amount of flip flops and singificantly slower timing than fakeram or real RAMs. + +![RAMs as flops histogram](histogram-sram-as-flops.png) + +## Results with `SYNTH_MOCK_LARGE_MEMORIES=1` + +To ensure a quick synthesis run and to better understand the design without being slowed down by large memory blocks, we set a `SYNTH_MEMORY_MAX_BITS=1024`. This helps us bypass potential memory-related issues and focus on other ORFS flow issues of the design. + +During synthesis, certain modules are reported in error messages when `SYNTH_MEMORY_MAX_BITS=1024` and `SYNTH_MOCK_LARGE_MEMORIES=0`. By explicitly listing these modules in `SYNTH_KEEP_MODULES`, we avoid further optimizations outside of the mocked memories that could obscure the behavior of the rest of the design. + +The goal of these settings is to enable a rapid exploration of the flow, providing insights into the design while minimizing complications from large memory structures. + +![Mocked memory histogram](histogram-mock-memory.png) + +## Other ways to speed up synthesis + +There is a small advantage in synthesis time for `SYNTH_MOCK_LARGE_MEMORIES=1`, it shaves off ca. 1 minute on a 3 minute build on a test on a laptop. However, larger designs can have synthesis run into hours if memories are not managed with a bit of care. + +For synthesis, yosys-abc actually takes most of the time and SRAMs don't generally change in a design, even if other RTL development continues. It is possible to keep the synthesized netlist for SRAMs list them in `SYNTH_BLACKBOXES` and simply concatenate the already built netlists onto the `1_synth.v` files before continuing the flow. + +If large modules that change rarely are kept in a large design and only a small part of the design changes during RTL development, then it is possible to set up a build flow that completes in minutes instead of hours. + +## A/B run times + +The difference in run-times for mocking and simply instantiating larger flip flop based RAMs is not large on this design, but on designs with bigger SRAMs, the difference can be substantial. + + make DESIGN_CONFIG=designs/sky130hd/microwatt/config.mk SYNTH_MOCK_LARGE_MEMORIES=1 FLOW_VARIANT=mock + make DESIGN_CONFIG=designs/sky130hd/microwatt/config.mk + +| Step | Mock RAM/s | Default/s | +|---------------------------|------------|-----------| +| 1_1_yosys_canonicalize | 4 | 4 | +| 1_2_yosys | 161 | 182 | +| 1_3_synth | | 1 | +| 2_1_floorplan | 72 | 83 | +| 2_2_floorplan_macro | 16 | 16 | +| 2_3_floorplan_tapcell | 1 | 0 | +| 2_4_floorplan_pdn | 7 | 9 | +| 3_1_place_gp_skip_io | 43 | 45 | +| 3_2_place_iop | 1 | 1 | +| 3_3_place_gp | 331 | 327 | +| 3_4_place_resized | 68 | 65 | +| 3_5_place_dp | 79 | 74 | +| 4_1_cts | 152 | 180 | +| 5_1_grt | 385 | 404 | +| 5_2_route | 3827 | 3960 | + +## `SYNTH_MOCK_LARGE_MEMORIES=1` worst ext_clk path + +``` +Startpoint: soc0/processor/icache_0/rams:1.way/cache_ram_0 + (rising edge-triggered flip-flop clocked by ext_clk) +Endpoint: soc0/processor/icache_0/_163_[147]$_DFFE_PP_ + (rising edge-triggered flip-flop clocked by ext_clk) +Path Group: ext_clk +Path Type: max + + Delay Time Description +--------------------------------------------------------- + 0.00 0.00 clock ext_clk (rise edge) + 4.07 4.07 clock network delay (propagated) + 0.00 4.07 ^ soc0/processor/icache_0/rams:1.way/cache_ram_0/CLK (RAM32_1RW1R) + 11.44 15.51 v soc0/processor/icache_0/rams:1.way/cache_ram_0/Do1[31] (RAM32_1RW1R) + 0.62 16.14 v soc0/processor/icache_0/rams:1.way/_43_/X (sky130_fd_sc_hd__mux2_4) + 0.42 16.56 v soc0/processor/icache_0/_2550_/X (sky130_fd_sc_hd__mux2_4) + 0.19 16.75 v place24125/X (sky130_fd_sc_hd__buf_12) + 0.15 16.90 v soc0/processor/decode1_0/_2318_/Y (sky130_fd_sc_hd__nand2b_4) + 0.38 17.27 v soc0/processor/decode1_0/_2375_/X (sky130_fd_sc_hd__or3_4) + 0.14 17.41 ^ soc0/processor/decode1_0/_2737_/Y (sky130_fd_sc_hd__nor2_4) + 0.07 17.48 v soc0/processor/decode1_0/_2738_/Y (sky130_fd_sc_hd__inv_2) + 0.19 17.67 ^ soc0/processor/decode1_0/_2740_/Y (sky130_fd_sc_hd__a21oi_4) + 0.24 17.91 v soc0/processor/decode1_0/_3744_/Y (sky130_fd_sc_hd__nand4b_1) + 0.16 18.06 ^ soc0/processor/decode1_0/_4248_/Y (sky130_fd_sc_hd__nand2b_1) + 0.16 18.22 ^ soc0/processor/_318_/X (sky130_fd_sc_hd__or2_4) + 0.05 18.27 v soc0/processor/icache_0/_2130_/Y (sky130_fd_sc_hd__nor2_4) + 0.09 18.36 ^ soc0/processor/icache_0/_2131_/Y (sky130_fd_sc_hd__nand2_4) + 0.05 18.41 v soc0/processor/icache_0/_2132_/Y (sky130_fd_sc_hd__a211oi_4) + 0.19 18.60 v rebuffer29423/X (sky130_fd_sc_hd__buf_12) + 0.11 18.72 ^ soc0/processor/icache_0/_2133_/Y (sky130_fd_sc_hd__nand2_8) + 0.06 18.78 v soc0/processor/icache_0/_2155_/Y (sky130_fd_sc_hd__inv_12) + 0.14 18.92 v place19388/X (sky130_fd_sc_hd__buf_12) + 0.14 19.06 v place19392/X (sky130_fd_sc_hd__buf_12) + 0.14 19.19 v place19394/X (sky130_fd_sc_hd__buf_12) + 0.16 19.35 v soc0/processor/icache_0/_2494_/X (sky130_fd_sc_hd__and2_4) + 0.00 19.35 v soc0/processor/icache_0/_163_[147]$_DFFE_PP_/D (sky130_fd_sc_hd__edfxtp_1) + 19.35 data arrival time + + 15.00 15.00 clock ext_clk (rise edge) + 3.42 18.42 clock network delay (propagated) + -0.25 18.17 clock uncertainty + 0.14 18.31 clock reconvergence pessimism + 18.31 ^ soc0/processor/icache_0/_163_[147]$_DFFE_PP_/CLK (sky130_fd_sc_hd__edfxtp_1) + -0.24 18.07 library setup time + 18.07 data required time +--------------------------------------------------------- + 18.07 data required time + -19.35 data arrival time +--------------------------------------------------------- + -1.27 slack (VIOLATED) +``` + +## `SYNTH_MOCK_LARGE_MEMORIES=0` worst ext_clk path + +As can be seen, there's no significant difference in the worst negative slack path for ext_clk. + +``` +Startpoint: soc0/processor/icache_0/rams:1.way/cache_ram_0 + (rising edge-triggered flip-flop clocked by ext_clk) +Endpoint: soc0/processor/icache_0/_163_[14]$_SDFFE_PP0P_ + (rising edge-triggered flip-flop clocked by ext_clk) +Path Group: ext_clk +Path Type: max + + Delay Time Description +--------------------------------------------------------- + 0.00 0.00 clock ext_clk (rise edge) + 4.04 4.04 clock network delay (propagated) + 0.00 4.04 ^ soc0/processor/icache_0/rams:1.way/cache_ram_0/CLK (RAM32_1RW1R) + 11.44 15.48 v soc0/processor/icache_0/rams:1.way/cache_ram_0/Do1[59] (RAM32_1RW1R) + 0.64 16.12 v soc0/processor/icache_0/rams:1.way/_76_/X (sky130_fd_sc_hd__mux2_4) + 0.36 16.48 v soc0/processor/icache_0/_2544_/X (sky130_fd_sc_hd__mux2_4) + 0.15 16.64 v place27067/X (sky130_fd_sc_hd__buf_6) + 0.06 16.70 ^ soc0/processor/decode1_0/_3560_/Y (sky130_fd_sc_hd__inv_4) + 0.16 16.85 ^ soc0/processor/decode1_0/_6875_/COUT (sky130_fd_sc_hd__ha_4) + 0.07 16.92 v soc0/processor/decode1_0/_3695_/Y (sky130_fd_sc_hd__nand2b_4) + 0.39 17.31 ^ soc0/processor/decode1_0/_3696_/Y (sky130_fd_sc_hd__nor3_4) + 0.20 17.51 ^ place24130/X (sky130_fd_sc_hd__buf_6) + 0.06 17.57 v soc0/processor/decode1_0/_5317_/Y (sky130_fd_sc_hd__nand2_4) + 0.30 17.87 ^ soc0/processor/decode1_0/_5318_/Y (sky130_fd_sc_hd__a21oi_4) + 0.19 18.06 ^ place23148/X (sky130_fd_sc_hd__buf_6) + 0.22 18.28 v soc0/processor/decode1_0/_6350_/Y (sky130_fd_sc_hd__nand4b_1) + 0.29 18.57 v place22875/X (sky130_fd_sc_hd__buf_6) + 0.10 18.67 ^ soc0/processor/decode1_0/_6854_/Y (sky130_fd_sc_hd__nand2b_4) + 0.15 18.82 ^ soc0/processor/_318_/X (sky130_fd_sc_hd__or2_4) + 0.12 18.94 ^ place22433/X (sky130_fd_sc_hd__buf_12) + 0.05 18.99 v soc0/processor/icache_0/_2130_/Y (sky130_fd_sc_hd__nor2_4) + 0.16 19.15 v place22148/X (sky130_fd_sc_hd__buf_6) + 0.08 19.23 ^ soc0/processor/icache_0/_2131_/Y (sky130_fd_sc_hd__nand2_4) + 0.07 19.30 v soc0/processor/icache_0/_2132_/Y (sky130_fd_sc_hd__a211oi_4) + 0.18 19.48 v place21617/X (sky130_fd_sc_hd__buf_12) + 0.11 19.59 ^ soc0/processor/icache_0/_2133_/Y (sky130_fd_sc_hd__nand2_8) + 0.06 19.65 v soc0/processor/icache_0/_2155_/Y (sky130_fd_sc_hd__inv_8) + 0.15 19.80 v place21391/X (sky130_fd_sc_hd__buf_12) + 0.13 19.93 v place21403/X (sky130_fd_sc_hd__buf_12) + 0.14 20.07 v rebuffer32771/X (sky130_fd_sc_hd__buf_4) + 0.19 20.26 ^ soc0/processor/icache_0/_2285_/Y (sky130_fd_sc_hd__mux2i_1) + 0.15 20.40 ^ place21348/X (sky130_fd_sc_hd__buf_4) + 0.04 20.44 v soc0/processor/icache_0/_2286_/Y (sky130_fd_sc_hd__nor2_1) + 0.00 20.44 v soc0/processor/icache_0/_163_[14]$_SDFFE_PP0P_/D (sky130_fd_sc_hd__dfxtp_1) + 20.44 data arrival time + + 15.00 15.00 clock ext_clk (rise edge) + 3.53 18.53 clock network delay (propagated) + -0.25 18.28 clock uncertainty + 0.14 18.42 clock reconvergence pessimism + 18.42 ^ soc0/processor/icache_0/_163_[14]$_SDFFE_PP0P_/CLK (sky130_fd_sc_hd__dfxtp_1) + -0.11 18.31 library setup time + 18.31 data required time +--------------------------------------------------------- + 18.31 data required time + -20.44 data arrival time +--------------------------------------------------------- + -2.13 slack (VIOLATED) +``` + +## Histogram of mocked memories + +It can be useful to look at the Endpoint Slack Histogram of mocked memories to examine if some of the paths are overly optimistic with a single row mocked memory or if the paths through the memory has problems even with a single row memory: + +Create a path group for the memories in question: + + group_path -through *decode1_0* -name mocked + +Now that path group is in the dropdown in the Endpoint Slack Histogram: + +![Mocked memory Endpoint Slack Histogram](mocked-histogram.png) + +## Conclusion + +Above there's no visible difference in the Endpoint Slack histogram for the two approaches. In other words, the design doesn't appear to be terribly sensitive to how RAMs are mocked, other factors dominate and merit further investigation. + +ORFS is built on `make`, which shines for simple, fast flows. For larger, complicated, designs and with flows that take a long time to run, it is worth looking beyond `make` to [bazel-orfs](https://github.com/The-OpenROAD-Project/bazel-orfs) + + diff --git a/flow/designs/sky130hd/microwatt/config.mk b/flow/designs/sky130hd/microwatt/config.mk index 5960708a65..6a2021c3f5 100644 --- a/flow/designs/sky130hd/microwatt/config.mk +++ b/flow/designs/sky130hd/microwatt/config.mk @@ -36,7 +36,18 @@ export SETUP_SLACK_MARGIN = 0.2 # GRT non-default config export FASTROUTE_TCL = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/fastroute.tcl -# This is high, some SRAMs should probably be converted -# to real SRAMs and not instantiated as flops -export SYNTH_MEMORY_MAX_BITS = 42000 - +ifeq ($(SYNTH_MOCK_LARGE_MEMORIES),1) + # ca. 3 minutes to run make synth + # + # These module names comes from the error report when setting SYNTH_MEMORY_MAX_BITS=2048 + # and SYNTH_MOCK_LARGE_MEMORIES=0 + # + # The goal is to run through the flow quickly to learn what we can + # about the design without getting bogged down in memory issues. + export SYNTH_MEMORY_MAX_BITS ?= 1024 +else + export SYNTH_MEMORY_MAX_BITS ?= 42000 +endif + +export SWAP_ARITH_OPERATORS = 1 +export OPENROAD_HIERARCHICAL = 1 diff --git a/flow/designs/sky130hd/microwatt/histogram-mock-memory.png b/flow/designs/sky130hd/microwatt/histogram-mock-memory.png new file mode 100644 index 0000000000..5c6916c319 Binary files /dev/null and b/flow/designs/sky130hd/microwatt/histogram-mock-memory.png differ diff --git a/flow/designs/sky130hd/microwatt/histogram-sram-as-flops.png b/flow/designs/sky130hd/microwatt/histogram-sram-as-flops.png new file mode 100644 index 0000000000..3dc1505059 Binary files /dev/null and b/flow/designs/sky130hd/microwatt/histogram-sram-as-flops.png differ diff --git a/flow/designs/sky130hd/microwatt/mocked-histogram.png b/flow/designs/sky130hd/microwatt/mocked-histogram.png new file mode 100644 index 0000000000..ef34efd3b6 Binary files /dev/null and b/flow/designs/sky130hd/microwatt/mocked-histogram.png differ diff --git a/flow/designs/sky130hd/microwatt/rules-base.json b/flow/designs/sky130hd/microwatt/rules-base.json index d33120ac5c..b416ccb8b5 100644 --- a/flow/designs/sky130hd/microwatt/rules-base.json +++ b/flow/designs/sky130hd/microwatt/rules-base.json @@ -1,101 +1,6 @@ { - "cts__flow__warnings__count:CTS-0041": { - "value": 11, - "compare": "<=", - "level": "warning" - }, - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:DRT-0120": { - "value": 6, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:DRT-0349": { - "value": 10, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:GRT-0243": { - "value": 2, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0220": { - "value": 4, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0075": { - "value": 1001, - "compare": "<=", - "level": "warning" - }, - "flow__warnings__count:PDN-0110": { - "value": 123, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:GRT-0115": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0120": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0349": { - "value": 10, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:FLW-0010": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:GRT-0243": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "placeopt__flow__warnings__count:RSZ-0095": { - "value": 1, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { - "value": 732007.18, + "value": 689000.0, "compare": "<=" }, "constraints__clocks__count": { @@ -103,7 +8,7 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 5444158, + "value": 5433922, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { @@ -123,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -2.36, + "value": -2.14, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -409.0, + "value": -249.0, "compare": ">=" }, "cts__timing__hold__ws": { @@ -139,15 +44,15 @@ "compare": ">=" }, "globalroute__antenna_diodes_count": { - "value": 2373, + "value": 2808, "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -2.53, + "value": -2.61, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -429.0, + "value": -334.0, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -159,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 8055403, + "value": 7854871, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -171,43 +76,27 @@ "compare": "<=" }, "detailedroute__antenna_diodes_count": { - "value": 1594, + "value": 1565, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -1.52, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -95.2, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -3.25, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -458.0, - "compare": ">=" - }, "finish__timing__setup__ws": { - "value": -2.49, + "value": -1.75, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -436.0, + "value": -94.8, "compare": ">=" }, "finish__timing__hold__ws": { - "value": -0.866, + "value": -1.68, "compare": ">=" }, "finish__timing__hold__tns": { - "value": -7.77, + "value": -47.8, "compare": ">=" }, "finish__design__instance__area": { - "value": 5582894, + "value": 5578282, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/sky130hd/riscv32i/config.mk b/flow/designs/sky130hd/riscv32i/config.mk index 523df1d1c1..c13fa5886c 100644 --- a/flow/designs/sky130hd/riscv32i/config.mk +++ b/flow/designs/sky130hd/riscv32i/config.mk @@ -9,3 +9,6 @@ export CORE_UTILIZATION = 45 export PLACE_DENSITY_LB_ADDON = 0.2 export REMOVE_ABC_BUFFERS = 1 + +export SWAP_ARITH_OPERATORS = 1 +export OPENROAD_HIERARCHICAL = 1 diff --git a/flow/designs/sky130hd/riscv32i/rules-base.json b/flow/designs/sky130hd/riscv32i/rules-base.json index e980b235a6..bf28876dde 100644 --- a/flow/designs/sky130hd/riscv32i/rules-base.json +++ b/flow/designs/sky130hd/riscv32i/rules-base.json @@ -1,41 +1,6 @@ { - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:DRT-0349": { - "value": 10, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:GRT-0115": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0349": { - "value": 10, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { - "value": 70778.51, + "value": 70000.0, "compare": "<=" }, "constraints__clocks__count": { @@ -47,7 +12,7 @@ "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 7314, + "value": 8516, "compare": "<=" }, "detailedplace__design__violations": { @@ -63,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -1.85, + "value": -0.923, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -36.5, + "value": -24.7, "compare": ">=" }, "cts__timing__hold__ws": { @@ -83,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -2.07, + "value": -0.937, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -105.0, + "value": -21.1, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -114,28 +79,12 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -0.903, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -6.99, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -0.3, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -1.2, - "compare": ">=" - }, "finish__timing__setup__ws": { - "value": -1.85, + "value": -0.759, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -53.2, + "value": -18.0, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/designs/sky130hs/aes/config.mk b/flow/designs/sky130hs/aes/config.mk index 4bf78ac5ec..49bdcc926d 100644 --- a/flow/designs/sky130hs/aes/config.mk +++ b/flow/designs/sky130hs/aes/config.mk @@ -17,3 +17,5 @@ export REMOVE_ABC_BUFFERS = 1 export CTS_CLUSTER_SIZE = 10 export CTS_CLUSTER_DIAMETER = 50 +export SWAP_ARITH_OPERATORS = 1 +export OPENROAD_HIERARCHICAL = 1 diff --git a/flow/designs/sky130hs/aes/rules-base.json b/flow/designs/sky130hs/aes/rules-base.json index e5449e13d3..e2f22f9f5e 100644 --- a/flow/designs/sky130hs/aes/rules-base.json +++ b/flow/designs/sky130hs/aes/rules-base.json @@ -1,41 +1,6 @@ { - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:DRT-0349": { - "value": 10, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0220": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0349": { - "value": 10, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { - "value": 134349.28, + "value": 118000.0, "compare": "<=" }, "constraints__clocks__count": { @@ -43,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 170359, + "value": 162274, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 19930, + "value": 19666, "compare": "<=" }, "detailedplace__design__violations": { @@ -63,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.357, + "value": -0.144, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -0.584, + "value": -0.564, "compare": ">=" }, "cts__timing__hold__ws": { @@ -83,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.585, + "value": -0.244, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -5.4, + "value": -2.33, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -99,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 722796, + "value": 708382, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -114,28 +79,12 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -0.14, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -0.56, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -0.14, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -0.56, - "compare": ">=" - }, "finish__timing__setup__ws": { - "value": -0.313, + "value": -0.161, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -1.34, + "value": -0.605, "compare": ">=" }, "finish__timing__hold__ws": { @@ -147,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 184400, + "value": 178643, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/sky130hs/gcd/config.mk b/flow/designs/sky130hs/gcd/config.mk index bb3841d55a..51b0d87b38 100644 --- a/flow/designs/sky130hs/gcd/config.mk +++ b/flow/designs/sky130hs/gcd/config.mk @@ -13,3 +13,6 @@ export PLACE_DENSITY_LB_ADDON = 0.1 export TNS_END_PERCENT = 100 export EQUIVALENCE_CHECK ?= 1 export REMOVE_CELLS_FOR_EQY = sky130_fd_sc_hs__tapvpwrvgnd* + +#export SYNTH_HDL_FRONTEND ?= slang +#export OPENROAD_HIERARCHICAL ?= 1 diff --git a/flow/designs/sky130hs/gcd/rules-base.json b/flow/designs/sky130hs/gcd/rules-base.json index ea813033a3..66e0043059 100644 --- a/flow/designs/sky130hs/gcd/rules-base.json +++ b/flow/designs/sky130hs/gcd/rules-base.json @@ -1,49 +1,4 @@ { - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:DRT-0349": { - "value": 10, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0220": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0075": { - "value": 153, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0349": { - "value": 10, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { "value": 4532.91, "compare": "<=" @@ -53,11 +8,11 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 6702, + "value": 6389, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 741, + "value": 721, "compare": "<=" }, "detailedplace__design__violations": { @@ -65,7 +20,7 @@ "compare": "==" }, "cts__design__instance__count__setup_buffer": { - "value": 75, + "value": 63, "compare": "<=" }, "cts__design__instance__count__hold_buffer": { @@ -73,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.45, + "value": -0.358, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -13.2, + "value": -11.4, "compare": ">=" }, "cts__timing__hold__ws": { @@ -93,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.635, + "value": -0.499, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -19.1, + "value": -15.7, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -109,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 15082, + "value": 12067, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -124,28 +79,12 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -0.341, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -7.52, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -0.07, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -0.28, - "compare": ">=" - }, "finish__timing__setup__ws": { - "value": -0.552, + "value": -0.406, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -15.2, + "value": -11.6, "compare": ">=" }, "finish__timing__hold__ws": { @@ -157,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 8200, + "value": 7546, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/sky130hs/ibex/rules-base.json b/flow/designs/sky130hs/ibex/rules-base.json index cdc5c20e37..2115fef374 100644 --- a/flow/designs/sky130hs/ibex/rules-base.json +++ b/flow/designs/sky130hs/ibex/rules-base.json @@ -1,51 +1,6 @@ { - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:DRT-0120": { - "value": 3, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:DRT-0349": { - "value": 10, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0220": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0120": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0349": { - "value": 10, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { - "value": 214573.94, + "value": 214000.0, "compare": "<=" }, "constraints__clocks__count": { @@ -53,7 +8,7 @@ "compare": "==" }, "placeopt__design__instance__area": { - "value": 232924, + "value": 230821, "compare": "<=" }, "placeopt__design__instance__count__stdcell": { @@ -73,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.629, + "value": -0.37, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -2.53, + "value": -1.42, "compare": ">=" }, "cts__timing__hold__ws": { @@ -93,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -0.95, + "value": -0.548, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -250.0, + "value": -68.4, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -109,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 845495, + "value": 827164, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -124,28 +79,12 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -0.35, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -1.4, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -0.35, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -1.4, - "compare": ">=" - }, "finish__timing__setup__ws": { - "value": -0.859, + "value": -0.38, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -85.9, + "value": -2.86, "compare": ">=" }, "finish__timing__hold__ws": { @@ -157,7 +96,7 @@ "compare": ">=" }, "finish__design__instance__area": { - "value": 250383, + "value": 243893, "compare": "<=" } } \ No newline at end of file diff --git a/flow/designs/sky130hs/jpeg/config.mk b/flow/designs/sky130hs/jpeg/config.mk index 3ae6575637..867415edb2 100644 --- a/flow/designs/sky130hs/jpeg/config.mk +++ b/flow/designs/sky130hs/jpeg/config.mk @@ -16,3 +16,6 @@ export TNS_END_PERCENT = 100 export CTS_CLUSTER_SIZE = 30 export CTS_CLUSTER_DIAMETER = 50 + +export SWAP_ARITH_OPERATORS = 1 +export OPENROAD_HIERARCHICAL = 1 diff --git a/flow/designs/sky130hs/jpeg/rules-base.json b/flow/designs/sky130hs/jpeg/rules-base.json index ef42b4eb34..4529722811 100644 --- a/flow/designs/sky130hs/jpeg/rules-base.json +++ b/flow/designs/sky130hs/jpeg/rules-base.json @@ -1,49 +1,4 @@ { - "detailedroute__flow__warnings__count:DRT-0120": { - "value": 36, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:DRT-0349": { - "value": 10, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:EST-0027": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0220": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0120": { - "value": 9, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0349": { - "value": 10, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { "value": 653350.08, "compare": "<=" @@ -57,7 +12,7 @@ "compare": "<=" }, "placeopt__design__instance__count__stdcell": { - "value": 63375, + "value": 56059, "compare": "<=" }, "detailedplace__design__violations": { @@ -65,11 +20,11 @@ "compare": "==" }, "cts__design__instance__count__setup_buffer": { - "value": 5511, + "value": 4875, "compare": "<=" }, "cts__design__instance__count__hold_buffer": { - "value": 5511, + "value": 4875, "compare": "<=" }, "cts__timing__setup__ws": { @@ -89,7 +44,7 @@ "compare": ">=" }, "globalroute__antenna_diodes_count": { - "value": 332, + "value": 142, "compare": "<=" }, "globalroute__timing__setup__ws": { @@ -109,7 +64,7 @@ "compare": ">=" }, "detailedroute__route__wirelength": { - "value": 1619030, + "value": 1539590, "compare": "<=" }, "detailedroute__route__drc_errors": { @@ -124,22 +79,6 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -0.2, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -0.8, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -0.2, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -0.8, - "compare": ">=" - }, "finish__timing__setup__ws": { "value": -0.2, "compare": ">=" diff --git a/flow/designs/sky130hs/riscv32i/config.mk b/flow/designs/sky130hs/riscv32i/config.mk index 1cf6ab1cf9..cfe34db7a9 100644 --- a/flow/designs/sky130hs/riscv32i/config.mk +++ b/flow/designs/sky130hs/riscv32i/config.mk @@ -14,3 +14,6 @@ export TNS_END_PERCENT = 100 export FASTROUTE_TCL = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/fastroute.tcl export REMOVE_ABC_BUFFERS = 1 + +export SWAP_ARITH_OPERATORS = 1 +export OPENROAD_HIERARCHICAL = 1 diff --git a/flow/designs/sky130hs/riscv32i/rules-base.json b/flow/designs/sky130hs/riscv32i/rules-base.json index 4bfd0a6b94..38b5b87ef3 100644 --- a/flow/designs/sky130hs/riscv32i/rules-base.json +++ b/flow/designs/sky130hs/riscv32i/rules-base.json @@ -1,49 +1,4 @@ { - "cts__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:DRT-0349": { - "value": 10, - "compare": "<=", - "level": "warning" - }, - "detailedroute__flow__warnings__count:GRT-0243": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "finish__flow__warnings__count:GUI-0076": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:IFP-0028": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "floorplan__flow__warnings__count:ODB-0220": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalplace__flow__warnings__count:GRT-0115": { - "value": 1, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:DRT-0349": { - "value": 10, - "compare": "<=", - "level": "warning" - }, - "globalroute__flow__warnings__count:RSZ-0062": { - "value": 1, - "compare": "<=", - "level": "warning" - }, "synth__design__instance__area__stdcell": { "value": 97352.63, "compare": "<=" @@ -73,11 +28,11 @@ "compare": "<=" }, "cts__timing__setup__ws": { - "value": -0.617, + "value": -0.254, "compare": ">=" }, "cts__timing__setup__tns": { - "value": -26.8, + "value": -0.976, "compare": ">=" }, "cts__timing__hold__ws": { @@ -93,11 +48,11 @@ "compare": "<=" }, "globalroute__timing__setup__ws": { - "value": -1.05, + "value": -0.499, "compare": ">=" }, "globalroute__timing__setup__tns": { - "value": -25.8, + "value": -9.86, "compare": ">=" }, "globalroute__timing__hold__ws": { @@ -124,28 +79,12 @@ "value": 100, "compare": "<=" }, - "detailedroute__timing__setup__ws": { - "value": -0.24, - "compare": ">=" - }, - "detailedroute__timing__setup__tns": { - "value": -0.96, - "compare": ">=" - }, - "detailedroute__timing__hold__ws": { - "value": -0.24, - "compare": ">=" - }, - "detailedroute__timing__hold__tns": { - "value": -0.96, - "compare": ">=" - }, "finish__timing__setup__ws": { - "value": -0.859, + "value": -0.281, "compare": ">=" }, "finish__timing__setup__tns": { - "value": -10.5, + "value": -1.07, "compare": ">=" }, "finish__timing__hold__ws": { diff --git a/flow/platforms/ihp-sg13g2/sg13g2_update.py b/flow/platforms/ihp-sg13g2/sg13g2_update.py index 78919bbf48..ad358f8d7b 100644 --- a/flow/platforms/ihp-sg13g2/sg13g2_update.py +++ b/flow/platforms/ihp-sg13g2/sg13g2_update.py @@ -52,16 +52,33 @@ def download_github_file( sram_files = [ + "RM_IHPSG13_1P_64x64_c2_bm_bist", + "RM_IHPSG13_1P_256x8_c3_bm_bist", + "RM_IHPSG13_1P_256x16_c2_bm_bist", + "RM_IHPSG13_1P_256x32_c2_bm_bist", + "RM_IHPSG13_1P_256x48_c2_bm_bist", + "RM_IHPSG13_1P_256x64_c2_bm_bist", + "RM_IHPSG13_1P_512x8_c3_bm_bist", + "RM_IHPSG13_1P_512x16_c2_bm_bist", + "RM_IHPSG13_1P_512x32_c2_bm_bist", + "RM_IHPSG13_1P_512x64_c2_bm_bist", + "RM_IHPSG13_1P_1024x8_c2_bm_bist", "RM_IHPSG13_1P_1024x16_c2_bm_bist", + "RM_IHPSG13_1P_1024x32_c2_bm_bist", "RM_IHPSG13_1P_1024x64_c2_bm_bist", - "RM_IHPSG13_1P_1024x8_c2_bm_bist", "RM_IHPSG13_1P_2048x64_c2_bm_bist", - "RM_IHPSG13_1P_256x48_c2_bm_bist", - "RM_IHPSG13_1P_256x64_c2_bm_bist", - "RM_IHPSG13_1P_4096x16_c3_bm_bist", "RM_IHPSG13_1P_4096x8_c3_bm_bist", - "RM_IHPSG13_1P_512x64_c2_bm_bist", - "RM_IHPSG13_1P_64x64_c2_bm_bist", + "RM_IHPSG13_1P_4096x16_c3_bm_bist", + "RM_IHPSG13_1P_8192x32_c4", + "RM_IHPSG13_2P_64x32_c2", + "RM_IHPSG13_2P_256x8_c2_bm_bist", + "RM_IHPSG13_2P_256x16_c2_bm_bist", + "RM_IHPSG13_2P_256x32_c2_bm_bist", + "RM_IHPSG13_2P_512x8_c2_bm_bist", + "RM_IHPSG13_2P_512x16_c2_bm_bist", + "RM_IHPSG13_2P_512x32_c2_bm_bist", + "RM_IHPSG13_2P_1024x16_c2_bm_bist", + "RM_IHPSG13_2P_1024x32_c2_bm_bist", ] sram_lib_corners = [ "slow_1p08V_125C", @@ -73,8 +90,9 @@ def download_github_file( download_github_file("ihp-sg13g2/libs.tech/klayout/tech/sg13g2.lyp") download_github_file("ihp-sg13g2/libs.tech/klayout/tech/sg13g2.lyt") download_github_file("ihp-sg13g2/libs.tech/klayout/tech/sg13g2.map") -download_github_file("ihp-sg13g2/libs.tech/klayout/tech/drc/sg13g2_minimal.lydrc", "drc") -download_github_file("ihp-sg13g2/libs.tech/klayout/tech/drc/sg13g2_maximal.lydrc", "drc") +# The minimal/maximal DRC scripts have been replaced by a parameterizable sg13g2.drc in the main branch of IHP-Open-PDK. +#download_github_file("ihp-sg13g2/libs.tech/klayout/tech/drc/sg13g2_minimal.lydrc", "drc") +#download_github_file("ihp-sg13g2/libs.tech/klayout/tech/drc/sg13g2_maximal.lydrc", "drc") # LIB download_github_file("ihp-sg13g2/libs.ref/sg13g2_stdcell/lib/sg13g2_stdcell_slow_1p35V_125C.lib", "lib") download_github_file("ihp-sg13g2/libs.ref/sg13g2_stdcell/lib/sg13g2_stdcell_slow_1p08V_125C.lib", "lib") diff --git a/flow/platforms/nangate45/setRC.tcl b/flow/platforms/nangate45/setRC.tcl index f39d456de7..bcddfc72f3 100644 --- a/flow/platforms/nangate45/setRC.tcl +++ b/flow/platforms/nangate45/setRC.tcl @@ -1,15 +1,14 @@ # Liberty units are fF,kOhm set_layer_rc -layer metal1 -resistance 5.4286e-03 -capacitance 7.41819E-02 -set_layer_rc -layer metal2 -resistance 3.5714e-03 -capacitance 6.74606E-02 -set_layer_rc -layer metal3 -resistance 3.5714e-03 -capacitance 8.88758E-02 -set_layer_rc -layer metal4 -resistance 1.5000e-03 -capacitance 1.07121E-01 -set_layer_rc -layer metal5 -resistance 1.5000e-03 -capacitance 1.08964E-01 -set_layer_rc -layer metal6 -resistance 1.5000e-03 -capacitance 1.02044E-01 -set_layer_rc -layer metal7 -resistance 1.8750e-04 -capacitance 1.10436E-01 -set_layer_rc -layer metal8 -resistance 1.8750e-04 -capacitance 9.69714E-02 -# No calibration data available for metal9 and metal10 -#set_layer_rc -layer metal9 -resistance 3.7500e-05 -capacitance 3.6864e-02 -#set_layer_rc -layer metal10 -resistance 3.7500e-05 -capacitance 2.8042e-02 +set_layer_rc -layer metal2 -resistance 3.70635E-03 -capacitance 8.33611E-02 +set_layer_rc -layer metal3 -resistance 3.57728E-03 -capacitance 1.03981E-01 +set_layer_rc -layer metal4 -resistance 1.47397E-03 -capacitance 1.19150E-01 +set_layer_rc -layer metal5 -resistance 1.49065E-03 -capacitance 1.09256E-01 +set_layer_rc -layer metal6 -resistance 1.50265E-03 -capacitance 1.14168E-01 +set_layer_rc -layer metal7 -resistance 2.64082E-04 -capacitance 1.17491E-01 +set_layer_rc -layer metal8 -resistance 1.89296E-04 -capacitance 9.45346E-02 +set_layer_rc -layer metal9 -resistance 3.42860E-05 -capacitance 1.06091E-01 +set_layer_rc -layer metal10 -resistance 3.86540E-05 -capacitance 7.37095E-01 set_wire_rc -signal -layer metal3 set_wire_rc -clock -layer metal5 diff --git a/flow/scripts/README.md b/flow/scripts/README.md index be55534412..c8f19f0c08 100644 --- a/flow/scripts/README.md +++ b/flow/scripts/README.md @@ -94,3 +94,17 @@ Load synthesis result and list modules that were kept in hierarchical synthesis: aes_cipher_top aes_key_expand_128 % + +## Creating a .yaml file with specific variable values + +Print any variable in .yaml syntax. To create a .yaml file that +contains value of variables, run: + + make print-CORE_UTILIZATION print-PLACE_DENSITY > foo.yaml + +Outputs foo.yaml: + + CORE_UTILIZATION: 55 + PLACE_DENSITY: 0.30 + +Useful in bazel-orfs flows or debugging configuration. diff --git a/flow/scripts/cts.tcl b/flow/scripts/cts.tcl index 45241eb49d..ea251200ae 100644 --- a/flow/scripts/cts.tcl +++ b/flow/scripts/cts.tcl @@ -1,5 +1,6 @@ utl::set_metrics_stage "cts__{}" source $::env(SCRIPTS_DIR)/load.tcl +source $::env(SCRIPTS_DIR)/lec_check.tcl erase_non_stage_variables cts load_design 3_place.odb 3_place.sdc @@ -9,8 +10,8 @@ repair_clock_inverters proc save_progress { stage } { puts "Run 'make gui_$stage.odb' to load progress snapshot" - write_db $::env(RESULTS_DIR)/$stage.odb - write_sdc -no_timestamp $::env(RESULTS_DIR)/$stage.sdc + orfs_write_db $::env(RESULTS_DIR)/$stage.odb + orfs_write_sdc $::env(RESULTS_DIR)/$stage.sdc } # Run CTS @@ -34,7 +35,7 @@ set_dont_use $::env(DONT_USE_CELLS) log_cmd clock_tree_synthesis {*}$cts_args utl::push_metrics_stage "cts__{}__pre_repair_timing" -estimate_parasitics -placement +log_cmd estimate_parasitics -placement if { $::env(DETAILED_METRICS) } { report_metrics 4 "cts pre-repair-timing" } @@ -43,9 +44,14 @@ utl::pop_metrics_stage set_placement_padding -global \ -left $::env(CELL_PAD_IN_SITES_DETAIL_PLACEMENT) \ -right $::env(CELL_PAD_IN_SITES_DETAIL_PLACEMENT) -detailed_placement -estimate_parasitics -placement +set result [catch { detailed_placement } msg] +if { $result != 0 } { + save_progress 4_1_error + error "Detailed placement failed in CTS: $msg" +} + +log_cmd estimate_parasitics -placement if { $::env(CTS_SNAPSHOTS) } { save_progress 4_1_pre_repair_hold_setup @@ -55,18 +61,24 @@ if { !$::env(SKIP_CTS_REPAIR_TIMING) } { if { $::env(EQUIVALENCE_CHECK) } { write_eqy_verilog 4_before_rsz.v } + if { [env_var_exists_and_non_empty LEC_CHECK] } { + write_lec_verilog 4_before_rsz_lec.v + } repair_timing_helper if { $::env(EQUIVALENCE_CHECK) } { run_equivalence_test } + if { [env_var_exists_and_non_empty LEC_CHECK] } { + write_lec_verilog 4_after_rsz_lec.v + run_lec_test 4_rsz 4_before_rsz_lec.v 4_after_rsz_lec.v + } set result [catch { detailed_placement } msg] if { $result != 0 } { save_progress 4_1_error - puts "Detailed placement failed in CTS: $msg" - exit $result + error "Detailed placement failed in CTS: $msg" } check_placement -verbose @@ -76,5 +88,5 @@ report_metrics 4 "cts final" source_env_var_if_exists POST_CTS_TCL -write_db $::env(RESULTS_DIR)/4_1_cts.odb -write_sdc -no_timestamp $::env(RESULTS_DIR)/4_cts.sdc +orfs_write_db $::env(RESULTS_DIR)/4_1_cts.odb +orfs_write_sdc $::env(RESULTS_DIR)/4_cts.sdc diff --git a/flow/scripts/density_fill.tcl b/flow/scripts/density_fill.tcl index 08347868d5..a0f45f7276 100644 --- a/flow/scripts/density_fill.tcl +++ b/flow/scripts/density_fill.tcl @@ -8,7 +8,7 @@ if { $::env(USE_FILL) } { # The .v file is just for debugging purposes, not a result of # this stage. write_verilog $::env(RESULTS_DIR)/6_1_fill.v - write_db $::env(RESULTS_DIR)/6_1_fill.odb + orfs_write_db $::env(RESULTS_DIR)/6_1_fill.odb } else { log_cmd exec cp $::env(RESULTS_DIR)/5_route.odb $::env(RESULTS_DIR)/6_1_fill.odb # There is no 5_route.v file to copy diff --git a/flow/scripts/detail_place.tcl b/flow/scripts/detail_place.tcl index eff7a140d0..7c3c433f8a 100644 --- a/flow/scripts/detail_place.tcl +++ b/flow/scripts/detail_place.tcl @@ -27,15 +27,15 @@ proc do_dpl { } { utl::info FLW 12 "Placement violations [check_placement -verbose]." - estimate_parasitics -placement + log_cmd estimate_parasitics -placement } set result [catch { do_dpl } errMsg] if { $result != 0 } { - write_db $::env(RESULTS_DIR)/3_5_place_dp-failed.odb + orfs_write_db $::env(RESULTS_DIR)/3_5_place_dp-failed.odb error $errMsg } report_metrics 3 "detailed place" true false -write_db $::env(RESULTS_DIR)/3_5_place_dp.odb +orfs_write_db $::env(RESULTS_DIR)/3_5_place_dp.odb diff --git a/flow/scripts/detail_route.tcl b/flow/scripts/detail_route.tcl index 6022daecc1..e38a03089c 100644 --- a/flow/scripts/detail_route.tcl +++ b/flow/scripts/detail_route.tcl @@ -7,7 +7,7 @@ if { ![grt::have_routes] } { } if { $::env(SKIP_DETAILED_ROUTE) } { - write_db $::env(RESULTS_DIR)/5_2_route.odb + orfs_write_db $::env(RESULTS_DIR)/5_2_route.odb exit } @@ -77,6 +77,7 @@ if { ![design_is_routed] } { error "Design has unrouted nets." } -report_metrics 5 "detailed route" +# Don't report metrics as we have not extracted parasitics, which will happen +# in final so there is no need to repeat it here. -write_db $::env(RESULTS_DIR)/5_2_route.odb +orfs_write_db $::env(RESULTS_DIR)/5_2_route.odb diff --git a/flow/scripts/fillcell.tcl b/flow/scripts/fillcell.tcl index ea23e5b24f..ba4b96912e 100644 --- a/flow/scripts/fillcell.tcl +++ b/flow/scripts/fillcell.tcl @@ -8,7 +8,7 @@ if { [env_var_exists_and_non_empty FILL_CELLS] } { log_cmd filler_placement $::env(FILL_CELLS) check_placement - write_db $::env(RESULTS_DIR)/5_3_fillcell.odb + orfs_write_db $::env(RESULTS_DIR)/5_3_fillcell.odb } else { log_cmd exec cp $::env(RESULTS_DIR)/5_2_route.odb $::env(RESULTS_DIR)/5_3_fillcell.odb } diff --git a/flow/scripts/final_report.tcl b/flow/scripts/final_report.tcl index 5cebdf2ea8..928e92bf2b 100644 --- a/flow/scripts/final_report.tcl +++ b/flow/scripts/final_report.tcl @@ -8,7 +8,7 @@ set_propagated_clock [all_clocks] # Ensure all OR created (rsz/cts) instances are connected global_connect -write_db $::env(RESULTS_DIR)/6_final.odb +orfs_write_db $::env(RESULTS_DIR)/6_final.odb # Delete routing obstructions for final DEF source $::env(SCRIPTS_DIR)/deleteRoutingObstructions.tcl diff --git a/flow/scripts/floorplan.tcl b/flow/scripts/floorplan.tcl index 6aea30a20f..00c1b8dabe 100644 --- a/flow/scripts/floorplan.tcl +++ b/flow/scripts/floorplan.tcl @@ -1,7 +1,7 @@ utl::set_metrics_stage "floorplan__{}" source $::env(SCRIPTS_DIR)/load.tcl erase_non_stage_variables floorplan -load_design 1_synth.v 1_synth.sdc +load_design 1_synth.odb 1_synth.sdc proc report_unused_masters { } { set db [ord::get_db] @@ -130,7 +130,7 @@ if { !$::env(SKIP_REPAIR_TIE_FANOUT) } { } if { [env_var_exists_and_non_empty SWAP_ARITH_OPERATORS] } { - estimate_parasitics -placement + log_cmd estimate_parasitics -placement replace_arith_modules } @@ -150,5 +150,5 @@ report_metrics 2 "floorplan final" false false source_env_var_if_exists POST_FLOORPLAN_TCL source_env_var_if_exists IO_CONSTRAINTS -write_db $::env(RESULTS_DIR)/2_1_floorplan.odb -write_sdc -no_timestamp $::env(RESULTS_DIR)/2_1_floorplan.sdc +orfs_write_db $::env(RESULTS_DIR)/2_1_floorplan.odb +orfs_write_sdc $::env(RESULTS_DIR)/2_1_floorplan.sdc diff --git a/flow/scripts/floorplan_to_place.tcl b/flow/scripts/floorplan_to_place.tcl index 544e8db7d2..1cab12776e 100644 --- a/flow/scripts/floorplan_to_place.tcl +++ b/flow/scripts/floorplan_to_place.tcl @@ -1,384 +1,32 @@ -utl::set_metrics_stage "floorplan__{}" -source $::env(SCRIPTS_DIR)/load.tcl -load_design 1_synth.v 1_synth.sdc +# Enable keeping variables between stages +set ::env(KEEP_VARS) 1 # Floorplan - -proc report_unused_masters { } { - set db [ord::get_db] - set libs [$db getLibs] - set masters "" - foreach lib $libs { - foreach master [$lib getMasters] { - # filter out non-block masters, or you can remove this conditional to detect any unused master - if { [$master getType] == "BLOCK" } { - lappend masters $master - } - } - } - - set block [ord::get_db_block] - set insts [$block getInsts] - - foreach inst $insts { - set inst_master [$inst getMaster] - set masters [lsearch -all -not -inline $masters $inst_master] - } - - foreach master $masters { - puts "Master [$master getName] is loaded but not used in the design" - } -} - -report_unused_masters - -#Run check_setup -puts "\n==========================================================================" -puts "Floorplan check_setup" -puts "--------------------------------------------------------------------------" -check_setup - -set num_instances [llength [get_cells -hier *]] -puts "number instances in verilog is $num_instances" - -set additional_args "" -append_env_var additional_args ADDITIONAL_SITES -additional_sites 1 - -# Check which floorplan initialization method is specified (mutually exclusive) -set use_floorplan_def [env_var_exists_and_non_empty FLOORPLAN_DEF] -set use_footprint [env_var_exists_and_non_empty FOOTPRINT] -set use_die_and_core_area \ - [expr { [env_var_exists_and_non_empty DIE_AREA] && [env_var_exists_and_non_empty CORE_AREA] }] -set use_core_utilization [env_var_exists_and_non_empty CORE_UTILIZATION] - -# Enforce mutual exclusion - exactly one method must be specified -set methods_defined \ - [expr { $use_floorplan_def + $use_footprint + $use_die_and_core_area + $use_core_utilization }] -if { $methods_defined > 1 } { - puts "Error: Floorplan initialization methods are mutually exclusive, pick one." - exit 1 -} - -# Method 1: Use existing DEF file with floorplan data -if { $use_floorplan_def } { - log_cmd read_def -floorplan_initialize $env(FLOORPLAN_DEF) - # Method 2: Use ICeWall footprint file (platform-specific extension) -} elseif { $use_footprint } { - ICeWall load_footprint $env(FOOTPRINT) - - initialize_floorplan \ - -die_area [ICeWall get_die_area] \ - -core_area [ICeWall get_core_area] \ - -site $::env(PLACE_SITE) - - ICeWall init_footprint $env(SIG_MAP_FILE) - # Method 3: Use explicit die and core area coordinates -} elseif { $use_die_and_core_area } { - initialize_floorplan -die_area $::env(DIE_AREA) \ - -core_area $::env(CORE_AREA) \ - -site $::env(PLACE_SITE) \ - {*}$additional_args - # Method 4: Calculate core area from utilization, aspect ratio, and margins -} elseif { $use_core_utilization } { - initialize_floorplan -utilization $::env(CORE_UTILIZATION) \ - -aspect_ratio $::env(CORE_ASPECT_RATIO) \ - -core_space $::env(CORE_MARGIN) \ - -site $::env(PLACE_SITE) \ - {*}$additional_args -} else { - puts "Error: No floorplan initialization method specified" - exit 1 -} - -# Create routing tracks: MAKE_TRACKS script, platform make_tracks.tcl, or make_tracks command -if { [env_var_exists_and_non_empty MAKE_TRACKS] } { - log_cmd source $::env(MAKE_TRACKS) -} elseif { [file exists $::env(PLATFORM_DIR)/make_tracks.tcl] } { - log_cmd source $::env(PLATFORM_DIR)/make_tracks.tcl -} else { - make_tracks -} - -# Configure global routing: FASTROUTE_TCL script or -# set_global_routing_layer_adjustment/set_routing_layers -if { [env_var_exists_and_non_empty FASTROUTE_TCL] } { - log_cmd source $::env(FASTROUTE_TCL) -} else { - log_cmd \ - set_global_routing_layer_adjustment \ - $::env(MIN_ROUTING_LAYER)-$::env(MAX_ROUTING_LAYER) $::env(ROUTING_LAYER_ADJUSTMENT) - log_cmd set_routing_layers -signal $::env(MIN_ROUTING_LAYER)-$::env(MAX_ROUTING_LAYER) -} - -source_env_var_if_exists FOOTPRINT_TCL - -if { ![env_var_equal SKIP_REPAIR_TIE_FANOUT 1] } { - # This needs to come before any call to remove_buffers. You could have one - # tie driving multiple buffers that drive multiple outputs. - # Repair tie lo fanout - puts "Repair tie lo fanout..." - set tielo_cell_name [lindex $::env(TIELO_CELL_AND_PORT) 0] - set tielo_lib_name [get_name [get_property [lindex [get_lib_cell $tielo_cell_name] 0] library]] - set tielo_pin $tielo_lib_name/$tielo_cell_name/[lindex $::env(TIELO_CELL_AND_PORT) 1] - repair_tie_fanout -separation $::env(TIE_SEPARATION) $tielo_pin - - # Repair tie hi fanout - puts "Repair tie hi fanout..." - set tiehi_cell_name [lindex $::env(TIEHI_CELL_AND_PORT) 0] - set tiehi_lib_name [get_name [get_property [lindex [get_lib_cell $tiehi_cell_name] 0] library]] - set tiehi_pin $tiehi_lib_name/$tiehi_cell_name/[lindex $::env(TIEHI_CELL_AND_PORT) 1] - repair_tie_fanout -separation $::env(TIE_SEPARATION) $tiehi_pin -} - -if { [env_var_exists_and_non_empty SWAP_ARITH_OPERATORS] } { - estimate_parasitics -placement - replace_arith_modules -} - -if { [env_var_equals REMOVE_ABC_BUFFERS 1] } { - # remove buffers inserted by yosys/abc - remove_buffers -} else { - # Skip clone & split - set ::env(SETUP_MOVE_SEQUENCE) "unbuffer,sizeup,swap,buffer,vt_swap" - set ::env(SKIP_LAST_GASP) 1 - set additional_args_repair_timing "" - append_env_var additional_args_repair_timing MAX_REPAIR_TIMING_ITER -max_iterations 1 - repair_timing_helper -setup {*}$additional_args_repair_timing -} - -puts "Default units for flow" -report_units -report_units_metric -report_metrics 2 "floorplan final" false false - -source_env_var_if_exists POST_FLOORPLAN_TCL -source_env_var_if_exists IO_CONSTRAINTS - -write_db $::env(RESULTS_DIR)/2_1_floorplan.odb -write_sdc -no_timestamp $::env(RESULTS_DIR)/2_1_floorplan.sdc - +source $::env(SCRIPTS_DIR)/floorplan.tcl # Macro placement -source $::env(SCRIPTS_DIR)/macro_place_util.tcl - -write_db $::env(RESULTS_DIR)/2_2_floorplan_macro.odb -write_macro_placement $::env(RESULTS_DIR)/2_2_floorplan_macro.tcl - +source $::env(SCRIPTS_DIR)/macro_place.tcl # Tapcell insertion -if { [env_var_exists_and_non_empty TAPCELL_TCL] } { - source $::env(TAPCELL_TCL) -} else { - cut_rows -} - -write_db $::env(RESULTS_DIR)/2_3_floorplan_tapcell.odb +source $::env(SCRIPTS_DIR)/tapcell.tcl # PDN -source $::env(PDN_TCL) -pdngen - -source_env_var_if_exists POST_PDN_TCL - -# Check all supply nets -set block [ord::get_db_block] -foreach net [$block getNets] { - set type [$net getSigType] - if { $type == "POWER" || $type == "GROUND" } { - # Temporarily disable due to CI issues - # puts "Check supply: [$net getName]" - # check_power_grid -net [$net getName] - } -} - -write_db $::env(RESULTS_DIR)/2_4_floorplan_pdn.odb +source $::env(SCRIPTS_DIR)/pdn.tcl # Global placement skipping IOs -if { [env_var_exists_and_non_empty FLOORPLAN_DEF] } { - puts "FLOORPLAN_DEF is set. Skipping global placement without IOs" -} elseif { [all_pins_placed] } { - puts "All pins are placed. Skipping global placement without IOs" -} else { - log_cmd global_placement -skip_io -density [place_density_with_lb_addon] \ - -pad_left $::env(CELL_PAD_IN_SITES_GLOBAL_PLACEMENT) \ - -pad_right $::env(CELL_PAD_IN_SITES_GLOBAL_PLACEMENT) \ - {*}[env_var_or_empty GLOBAL_PLACEMENT_ARGS] -} - -write_db $::env(RESULTS_DIR)/3_1_place_gp_skip_io.odb +source $::env(SCRIPTS_DIR)/global_place_skip_io.tcl # IO placement -if { - ![env_var_exists_and_non_empty FLOORPLAN_DEF] && - ![env_var_exists_and_non_empty FOOTPRINT] && - ![env_var_exists_and_non_empty FOOTPRINT_TCL] -} { - # load_design 3_1_place_gp_skip_io.odb 2_floorplan.sdc - log_cmd place_pins \ - -hor_layers $::env(IO_PLACER_H) \ - -ver_layers $::env(IO_PLACER_V) \ - {*}[env_var_or_empty PLACE_PINS_ARGS] - write_db $::env(RESULTS_DIR)/3_2_place_iop.odb - write_pin_placement $::env(RESULTS_DIR)/3_2_place_iop.tcl -} else { - log_cmd exec cp $::env(RESULTS_DIR)/3_1_place_gp_skip_io.odb $::env(RESULTS_DIR)/3_2_place_iop.odb -} +source $::env(SCRIPTS_DIR)/io_placement.tcl # Global placement -utl::set_metrics_stage "globalplace__{}" -set_dont_use $::env(DONT_USE_CELLS) - -if { $::env(GPL_TIMING_DRIVEN) } { - remove_buffers -} - -# Do not buffer chip-level designs -# by default, IO ports will be buffered -# to not buffer IO ports, set environment variable -# DONT_BUFFER_PORT = 1 -if { ![env_var_exists_and_non_empty FOOTPRINT] } { - if { ![env_var_equals DONT_BUFFER_PORTS 1] } { - puts "Perform port buffering..." - buffer_ports - } -} - -set global_placement_args {} - -# Parameters for routability mode in global placement -append_env_var global_placement_args GPL_ROUTABILITY_DRIVEN -routability_driven 0 - -# Parameters for timing driven mode in global placement -if { $::env(GPL_TIMING_DRIVEN) } { - lappend global_placement_args {-timing_driven} - if { [info exists ::env(GPL_KEEP_OVERFLOW)] } { - lappend global_placement_args -keep_resize_below_overflow $::env(GPL_KEEP_OVERFLOW) - } -} - -proc do_placement { global_placement_args } { - set all_args [concat [list -density [place_density_with_lb_addon] \ - -pad_left $::env(CELL_PAD_IN_SITES_GLOBAL_PLACEMENT) \ - -pad_right $::env(CELL_PAD_IN_SITES_GLOBAL_PLACEMENT)] \ - $global_placement_args] - - lappend all_args {*}[env_var_or_empty GLOBAL_PLACEMENT_ARGS] - - log_cmd global_placement {*}$all_args -} - -set result [catch { do_placement $global_placement_args } errMsg] -if { $result != 0 } { - write_db $::env(RESULTS_DIR)/3_3_place_gp-failed.odb - error $errMsg -} - -estimate_parasitics -placement - -if { [env_var_equals CLUSTER_FLOPS 1] } { - cluster_flops - estimate_parasitics -placement -} - -report_metrics 3 "global place" false false - -write_db $::env(RESULTS_DIR)/3_3_place_gp.odb +source $::env(SCRIPTS_DIR)/global_place.tcl # Resizing -utl::set_metrics_stage "placeopt__{}" -estimate_parasitics -placement - -set instance_count_before [sta::network_leaf_instance_count] -set pin_count_before [sta::network_leaf_pin_count] - -set_dont_use $::env(DONT_USE_CELLS) - -if { [env_var_exists_and_non_empty EARLY_SIZING_CAP_RATIO] } { - log_cmd set_opt_config -set_early_sizing_cap_ratio $env(EARLY_SIZING_CAP_RATIO) -} - -if { [env_var_exists_and_non_empty SWAP_ARITH_OPERATORS] } { - replace_arith_modules -} - -repair_design_helper - -# hold violations are not repaired until after CTS - -# post report - -puts "Floating nets: " -report_floating_nets - -report_metrics 3 "resizer" true false - -puts "Instance count before $instance_count_before, after [sta::network_leaf_instance_count]" -puts "Pin count before $pin_count_before, after [sta::network_leaf_pin_count]" - -write_db $::env(RESULTS_DIR)/3_4_place_resized.odb +source $::env(SCRIPTS_DIR)/resize.tcl # Detailed placement -utl::set_metrics_stage "detailedplace__{}" - -source $::env(PLATFORM_DIR)/setRC.tcl - -proc do_dpl { } { - # Only for use with hybrid rows - if { [env_var_equals BALANCE_ROWS 1] } { - balance_row_usage - } - - set_placement_padding -global \ - -left $::env(CELL_PAD_IN_SITES_DETAIL_PLACEMENT) \ - -right $::env(CELL_PAD_IN_SITES_DETAIL_PLACEMENT) - detailed_placement - - if { [env_var_equals ENABLE_DPO 1] } { - if { [env_var_exists_and_non_empty DPO_MAX_DISPLACEMENT] } { - improve_placement -max_displacement $::env(DPO_MAX_DISPLACEMENT) - } else { - improve_placement - } - } - optimize_mirroring - - utl::info FLW 12 "Placement violations [check_placement -verbose]." - - estimate_parasitics -placement -} - -set result [catch { do_dpl } errMsg] -if { $result != 0 } { - write_db $::env(RESULTS_DIR)/3_5_place_dp-failed.odb - error $errMsg -} - -report_metrics 3 "detailed place" true false - -write_db $::env(RESULTS_DIR)/3_5_place_dp.odb +source $::env(SCRIPTS_DIR)/detail_place.tcl # Repair timing after placement -utl::set_metrics_stage "place_repair_timing__{}" - -set_placement_padding -global \ - -left $::env(CELL_PAD_IN_SITES_DETAIL_PLACEMENT) \ - -right $::env(CELL_PAD_IN_SITES_DETAIL_PLACEMENT) - -puts "Repair setup and hold violations" -estimate_parasitics -placement - -set additional_args_repair_timing "" -append_env_var additional_args_repair_timing MAX_REPAIR_TIMING_ITER -max_iterations 1 - -log_cmd repair_timing -repair_tns $::env(TNS_END_PERCENT) \ - {*}$additional_args_repair_timing - -# Legalize placement after timing repair -detailed_placement - -puts "Estimate parasitics" -estimate_parasitics -placement -report_metrics 3 "place repair timing" true false - -write_db $::env(RESULTS_DIR)/3_6_place_repair_timing.odb +source $::env(SCRIPTS_DIR)/repair_timing_post_place.tcl diff --git a/flow/scripts/flow.sh b/flow/scripts/flow.sh index 96ef5615e0..018031ae2c 100755 --- a/flow/scripts/flow.sh +++ b/flow/scripts/flow.sh @@ -1,11 +1,21 @@ #!/usr/bin/env bash -set -u -eo pipefail -mkdir -p $RESULTS_DIR $LOG_DIR $REPORTS_DIR $OBJECTS_DIR -echo Running $2.tcl, stage $1 -(trap 'mv $LOG_DIR/$1.tmp.log $LOG_DIR/$1.log' EXIT; \ - $OPENROAD_EXE $OPENROAD_ARGS -exit $SCRIPTS_DIR/noop.tcl 2>&1 >$LOG_DIR/$1.tmp.log; \ - eval "$TIME_CMD $OPENROAD_CMD -no_splash $SCRIPTS_DIR/$2.tcl -metrics $LOG_DIR/$1.json" 2>&1 | \ - tee -a $(realpath $LOG_DIR/$1.tmp.log)) +set -euo pipefail + +mkdir -p "$RESULTS_DIR" "$LOG_DIR" "$REPORTS_DIR" "$OBJECTS_DIR" + +echo "Running $2.tcl, stage $1" + +( + trap 'mv "$LOG_DIR/$1.tmp.log" "$LOG_DIR/$1.log"' EXIT + + "$OPENROAD_EXE" $OPENROAD_ARGS -exit "$SCRIPTS_DIR/noop.tcl" \ + >"$LOG_DIR/$1.tmp.log" 2>&1 + + eval "$TIME_CMD $OPENROAD_CMD -no_splash \"$SCRIPTS_DIR/$2.tcl\" -metrics \"$LOG_DIR/$1.json\"" \ + 2>&1 | tee -a "$(realpath "$LOG_DIR/$1.tmp.log")" +) + # Log the hash for this step. The summary "make elapsed" in "make finish", # will not have all the .odb files for the bazel-orfs use-case. -$PYTHON_EXE $UTILS_DIR/genElapsedTime.py --match $1 -d $LOG_DIR | tee -a $(realpath $LOG_DIR/$1.log) +"$PYTHON_EXE" "$UTILS_DIR/genElapsedTime.py" --match "$1" -d "$LOG_DIR" \ + | tee -a "$(realpath "$LOG_DIR/$1.log")" diff --git a/flow/scripts/global_place.tcl b/flow/scripts/global_place.tcl index 715b0bdae0..6ef3df9a34 100644 --- a/flow/scripts/global_place.tcl +++ b/flow/scripts/global_place.tcl @@ -16,7 +16,7 @@ if { $::env(GPL_TIMING_DRIVEN) } { if { ![env_var_exists_and_non_empty FOOTPRINT] } { if { !$::env(DONT_BUFFER_PORTS) } { puts "Perform port buffering..." - buffer_ports + buffer_ports {*}[env_var_or_empty BUFFER_PORTS_ARGS] } } @@ -33,6 +33,21 @@ if { $::env(GPL_TIMING_DRIVEN) } { } } +# Parameters for phi coefficients in global placement +set min_phi $::env(MIN_PLACE_STEP_COEF) +set max_phi $::env(MAX_PLACE_STEP_COEF) + +if { $min_phi > $max_phi } { + utl::error GPL 200 \ + "MIN_PLACE_STEP_COEF ($min_phi) cannot be greater than \ +MAX_PLACE_STEP_COEF ($max_phi)" +} + +lappend global_placement_args -force_center_initial_place + +lappend global_placement_args -min_phi_coef $::env(MIN_PLACE_STEP_COEF) +lappend global_placement_args -max_phi_coef $::env(MAX_PLACE_STEP_COEF) + proc do_placement { global_placement_args } { set all_args [concat [list -density [place_density_with_lb_addon] \ -pad_left $::env(CELL_PAD_IN_SITES_GLOBAL_PLACEMENT) \ @@ -46,17 +61,17 @@ proc do_placement { global_placement_args } { set result [catch { do_placement $global_placement_args } errMsg] if { $result != 0 } { - write_db $::env(RESULTS_DIR)/3_3_place_gp-failed.odb + orfs_write_db $::env(RESULTS_DIR)/3_3_place_gp-failed.odb error $errMsg } -estimate_parasitics -placement +log_cmd estimate_parasitics -placement if { $::env(CLUSTER_FLOPS) } { cluster_flops - estimate_parasitics -placement + log_cmd estimate_parasitics -placement } report_metrics 3 "global place" false false -write_db $::env(RESULTS_DIR)/3_3_place_gp.odb +orfs_write_db $::env(RESULTS_DIR)/3_3_place_gp.odb diff --git a/flow/scripts/global_place_skip_io.tcl b/flow/scripts/global_place_skip_io.tcl index b528856448..550df07fb6 100644 --- a/flow/scripts/global_place_skip_io.tcl +++ b/flow/scripts/global_place_skip_io.tcl @@ -13,4 +13,4 @@ if { [env_var_exists_and_non_empty FLOORPLAN_DEF] } { {*}[env_var_or_empty GLOBAL_PLACEMENT_ARGS] } -write_db $::env(RESULTS_DIR)/3_1_place_gp_skip_io.odb +orfs_write_db $::env(RESULTS_DIR)/3_1_place_gp_skip_io.odb diff --git a/flow/scripts/global_route.tcl b/flow/scripts/global_route.tcl index 905bce5571..ba95205db6 100644 --- a/flow/scripts/global_route.tcl +++ b/flow/scripts/global_route.tcl @@ -23,17 +23,17 @@ proc global_route_helper { } { append_env_var additional_args VIA_IN_PIN_MIN_LAYER -via_in_pin_bottom_layer 1 append_env_var additional_args VIA_IN_PIN_MAX_LAYER -via_in_pin_top_layer 1 - pin_access {*}$additional_args + log_cmd pin_access {*}$additional_args set result [catch { do_global_route $res_aware } errMsg] if { $result != 0 } { if { !$::env(GENERATE_ARTIFACTS_ON_FAILURE) } { - write_db $::env(RESULTS_DIR)/5_1_grt-failed.odb + orfs_write_db $::env(RESULTS_DIR)/5_1_grt-failed.odb error $errMsg } - write_sdc -no_timestamp $::env(RESULTS_DIR)/5_1_grt.sdc - write_db $::env(RESULTS_DIR)/5_1_grt.odb + orfs_write_sdc $::env(RESULTS_DIR)/5_1_grt.sdc + orfs_write_db $::env(RESULTS_DIR)/5_1_grt.odb return } @@ -42,7 +42,7 @@ proc global_route_helper { } { -right $::env(CELL_PAD_IN_SITES_DETAIL_PLACEMENT) set_propagated_clock [all_clocks] - estimate_parasitics -global_routing + log_cmd estimate_parasitics -global_routing if { [env_var_exists_and_non_empty DONT_USE_CELLS] } { set_dont_use $::env(DONT_USE_CELLS) @@ -69,7 +69,7 @@ proc global_route_helper { } { # Repair timing using global route parasitics puts "Repair setup and hold violations..." - estimate_parasitics -global_routing + log_cmd estimate_parasitics -global_routing repair_timing_helper @@ -104,7 +104,7 @@ proc global_route_helper { } { } puts "Estimate parasitics..." - estimate_parasitics -global_routing + log_cmd estimate_parasitics -global_routing report_metrics 5 "global route" @@ -113,8 +113,8 @@ proc global_route_helper { } { source [file join $::env(SCRIPTS_DIR) "write_ref_sdc.tcl"] write_guides $::env(RESULTS_DIR)/route.guide - write_db $::env(RESULTS_DIR)/5_1_grt.odb - write_sdc -no_timestamp $::env(RESULTS_DIR)/5_1_grt.sdc + orfs_write_db $::env(RESULTS_DIR)/5_1_grt.odb + orfs_write_sdc $::env(RESULTS_DIR)/5_1_grt.sdc } global_route_helper diff --git a/flow/scripts/io_placement.tcl b/flow/scripts/io_placement.tcl index e4f61e0983..0ec25dc545 100644 --- a/flow/scripts/io_placement.tcl +++ b/flow/scripts/io_placement.tcl @@ -11,7 +11,7 @@ if { -hor_layers $::env(IO_PLACER_H) \ -ver_layers $::env(IO_PLACER_V) \ {*}[env_var_or_empty PLACE_PINS_ARGS] - write_db $::env(RESULTS_DIR)/3_2_place_iop.odb + orfs_write_db $::env(RESULTS_DIR)/3_2_place_iop.odb write_pin_placement $::env(RESULTS_DIR)/3_2_place_iop.tcl } else { log_cmd exec cp $::env(RESULTS_DIR)/3_1_place_gp_skip_io.odb $::env(RESULTS_DIR)/3_2_place_iop.odb diff --git a/flow/scripts/lec_check.tcl b/flow/scripts/lec_check.tcl new file mode 100644 index 0000000000..b89b8cb5ad --- /dev/null +++ b/flow/scripts/lec_check.tcl @@ -0,0 +1,38 @@ +proc write_lec_verilog { filename } { + if { [env_var_exists_and_non_empty REMOVE_CELLS_FOR_EQY] } { + write_verilog -remove_cells $::env(REMOVE_CELLS_FOR_EQY) $::env(RESULTS_DIR)/$filename + } else { + write_verilog $::env(RESULTS_DIR)/$filename + } +} + +proc write_lec_script { step file1 file2 } { + set outfile [open "$::env(OBJECTS_DIR)/${step}_lec_test.yml" w] + puts $outfile "format: verilog" + puts $outfile "input_paths:" + puts $outfile " - $::env(RESULTS_DIR)/${file1}" + puts $outfile " - $::env(RESULTS_DIR)/${file2}" + puts $outfile "liberty_files:" + foreach libFile $::env(LIB_FILES) { + puts $outfile " - $libFile" + } + puts $outfile "log_file: $::env(LOG_DIR)/${step}_lec_check.log" + close $outfile +} + +proc run_lec_test { step file1 file2 } { + write_lec_script $step $file1 $file2 + # tclint-disable-next-line command-args + eval exec kepler-formal --config $::env(OBJECTS_DIR)/${step}_lec_test.yml + try { + set count [exec grep -c "Found difference" $::env(LOG_DIR)/${step}_lec_check.log]] + } trap CHILDSTATUS {results options} { + # This block executes if grep returns a non-zero exit code + set count 0 + } + if { $count > 0 } { + error "Repair timing output failed lec test" + } else { + puts "Repair timing output passed lec test" + } +} diff --git a/flow/scripts/load.tcl b/flow/scripts/load.tcl index 02621b4a56..23ea45dc27 100644 --- a/flow/scripts/load.tcl +++ b/flow/scripts/load.tcl @@ -3,6 +3,12 @@ source $::env(SCRIPTS_DIR)/util.tcl source $::env(SCRIPTS_DIR)/report_metrics.tcl proc load_design { design_file sdc_file } { + # Do not reload if design is already loaded + set db [ord::get_db] + if { [$db getChip] != "NULL" && [[$db getChip] getBlock] != "NULL" } { + return + } + source_env_var_if_exists PLATFORM_TCL source $::env(SCRIPTS_DIR)/read_liberty.tcl @@ -32,7 +38,11 @@ proc load_design { design_file sdc_file } { log_cmd source $::env(PLATFORM_DIR)/derate.tcl } - source $::env(PLATFORM_DIR)/setRC.tcl + if { [env_var_exists_and_non_empty LAYER_PARASITICS_FILE] } { + log_cmd source $::env(LAYER_PARASITICS_FILE) + } else { + log_cmd source $::env(PLATFORM_DIR)/setRC.tcl + } if { [env_var_equals LIB_MODEL CCS] } { puts "Using CCS delay calculation" diff --git a/flow/scripts/macro_place.tcl b/flow/scripts/macro_place.tcl index cc0f7706c6..302dd7b9c7 100644 --- a/flow/scripts/macro_place.tcl +++ b/flow/scripts/macro_place.tcl @@ -4,5 +4,5 @@ load_design 2_1_floorplan.odb 2_1_floorplan.sdc source $::env(SCRIPTS_DIR)/macro_place_util.tcl -write_db $::env(RESULTS_DIR)/2_2_floorplan_macro.odb +orfs_write_db $::env(RESULTS_DIR)/2_2_floorplan_macro.odb write_macro_placement $::env(RESULTS_DIR)/2_2_floorplan_macro.tcl diff --git a/flow/scripts/macro_place_util.tcl b/flow/scripts/macro_place_util.tcl index 9cd68575b9..ab64deb685 100644 --- a/flow/scripts/macro_place_util.tcl +++ b/flow/scripts/macro_place_util.tcl @@ -52,7 +52,6 @@ if { [find_macros] != "" } { append_env_var additional_rtlmp_args RTLMP_OUTLINE_WT -outline_weight 1 append_env_var additional_rtlmp_args RTLMP_BOUNDARY_WT -boundary_weight 1 append_env_var additional_rtlmp_args RTLMP_NOTCH_WT -notch_weight 1 - append_env_var additional_rtlmp_args RTLMP_DEAD_SPACE -target_dead_space 1 append_env_var additional_rtlmp_args RTLMP_RPT_DIR -report_directory 1 append_env_var additional_rtlmp_args RTLMP_FENCE_LX -fence_lx 1 append_env_var additional_rtlmp_args RTLMP_FENCE_LY -fence_ly 1 @@ -61,6 +60,10 @@ if { [find_macros] != "" } { append additional_rtlmp_args " -target_util [place_density_with_lb_addon]" + if { $::env(RTLMP_DATA_FLOW_DRIVEN) } { + append additional_rtlmp_args " -data_flow_driven" + } + set all_args $additional_rtlmp_args if { [env_var_exists_and_non_empty RTLMP_ARGS] } { diff --git a/flow/scripts/mem_dump.py b/flow/scripts/mem_dump.py index 36956bece8..aac74f9e56 100644 --- a/flow/scripts/mem_dump.py +++ b/flow/scripts/mem_dump.py @@ -4,8 +4,6 @@ def find_top_modules(data): - # There can be some cruft in the modules list so that - # we have multiple top level candidates. top_module = [] instantiations = set( [ @@ -14,7 +12,7 @@ def find_top_modules(data): for cell in minfo2["cells"].values() ] ) - for mname, minfo in data["modules"].items(): + for mname in data["modules"].keys(): if mname not in instantiations: top_module.append(mname) return top_module @@ -23,16 +21,6 @@ def find_top_modules(data): def find_cells_by_type_in_module( module_name, data, target_type, current_path, matching_cells ): - """ - Searches through hierarchy starting at module_name to find all instances of - the given module/type in the hierarchy. - - Returns list of cell paths, which are constructed as: - - .(.+). - - where the child_inst_name/child_module_name pairs are repeated for each level of the hierarchy. - """ for cell_name, cell in data["modules"][module_name]["cells"].items(): cell_path = ( f"{current_path}.{module_name}.{cell_name}" @@ -42,18 +30,15 @@ def find_cells_by_type_in_module( if cell["type"] == target_type: matching_cells.append(cell_path) elif cell["type"] in data["modules"]: - # Recursively search within the module matching_cells.extend( find_cells_by_type_in_module( cell["type"], data, target_type, cell_path, [] ) ) - return matching_cells def find_cells_by_type(top_modules, data, module_name, current_path=""): - # first find top module, the module without any submodules names = [] for top_module in top_modules: names.extend( @@ -69,13 +54,12 @@ def format_ram_table_from_json(data, max_bits=None): formatting = "{:>5} | {:>5} | {:>6} | {:<20} | {:<80}\n" table = formatting.format("Rows", "Width", "Bits", "Module", "Instances") table += "-" * len(table) + "\n" + max_ok = True entries = [] - # Collect the entries in a list for module_name, module_info in data["modules"].items(): - cells = module_info["cells"] - for cell in cells.values(): + for cell in module_info["cells"].values(): if not cell["type"].startswith("$mem"): continue parameters = cell["parameters"] @@ -84,18 +68,38 @@ def format_ram_table_from_json(data, max_bits=None): instances = find_cells_by_type(top_modules, data, module_name) instance_bits = size * width bits = instance_bits * len(instances) + entries.append((size, width, bits, module_name, ", ".join(instances))) + if max_bits is not None and instance_bits > max_bits: max_ok = False - # Sort the entries by descending bits entries.sort(key=lambda x: x[2], reverse=True) - # Format the sorted entries into the table for entry in entries: table += formatting.format(*entry) - return table, max_ok + # ---- Summary statistics ---- + total_bits = sum(e[2] for e in entries) + + largest_instance_bits = 0 + largest_instance_module = None + + for size, width, _, module, _ in entries: + instance_bits = size * width + if instance_bits > largest_instance_bits: + largest_instance_bits = instance_bits + largest_instance_module = module + + summary = { + "memory_count": len(entries), + "largest_instance_bits": largest_instance_bits, + "largest_instance_module": largest_instance_module, + "largest_total_bits": entries[0][2] if entries else 0, + "total_bits": total_bits, + } + + return table, max_ok, summary if __name__ == "__main__": @@ -119,9 +123,27 @@ def format_ram_table_from_json(data, max_bits=None): print(" " + "\n ".join(src_files)) print("Memories found in the design:") - formatted_table, max_ok = format_ram_table_from_json(json_data, args.max_bits) + formatted_table, max_ok, summary = format_ram_table_from_json( + json_data, args.max_bits + ) + print(formatted_table) - if not max_ok: - sys.exit( - f"Error: Synthesized memory size {args.max_bits} exceeds SYNTH_MEMORY_MAX_BITS" - ) + + print("Summary:") + print(f"- Total inferred memories: {summary['memory_count']}") + print( + f"- Largest single memory instance: " + f"{summary['largest_instance_bits']} bits " + f"(module {summary['largest_instance_module']})" + ) + print(f"- Total inferred memory bits (all instances): {summary['total_bits']}") + + if args.max_bits is not None: + status = "OK" if max_ok else "FAIL" + print(f"- SYNTH_MEMORY_MAX_BITS: {args.max_bits}") + print(f"- Status: {status}") + + if not max_ok: + sys.exit( + f"Error: Synthesized memory size {args.max_bits} exceeds SYNTH_MEMORY_MAX_BITS" + ) diff --git a/flow/scripts/open.tcl b/flow/scripts/open.tcl index 28f1295062..48d881afca 100644 --- a/flow/scripts/open.tcl +++ b/flow/scripts/open.tcl @@ -34,7 +34,11 @@ proc read_timing { input_file } { source $::env(PLATFORM_DIR)/derate.tcl } - source $::env(PLATFORM_DIR)/setRC.tcl + if { [env_var_exists_and_non_empty LAYER_PARASITICS_FILE] } { + log_cmd source $::env(LAYER_PARASITICS_FILE) + } else { + log_cmd source $::env(PLATFORM_DIR)/setRC.tcl + } if { $design_stage >= 4 } { # CTS has run, so propagate clocks set_propagated_clock [all_clocks] @@ -47,7 +51,6 @@ proc read_timing { input_file } { log_cmd estimate_parasitics -global_routing } else { puts "No global routing results available, skipping estimate_parasitics" - puts "Load $::global_route_congestion_report for details" } } elseif { $design_stage >= 3 } { log_cmd estimate_parasitics -placement diff --git a/flow/scripts/pdn.tcl b/flow/scripts/pdn.tcl index 72d2c55c14..977fe71f1e 100644 --- a/flow/scripts/pdn.tcl +++ b/flow/scripts/pdn.tcl @@ -18,4 +18,4 @@ foreach net [$block getNets] { } } -write_db $::env(RESULTS_DIR)/2_4_floorplan_pdn.odb +orfs_write_db $::env(RESULTS_DIR)/2_4_floorplan_pdn.odb diff --git a/flow/scripts/repair_timing_post_place.tcl b/flow/scripts/repair_timing_post_place.tcl index a74b8c2b1a..88757727ea 100644 --- a/flow/scripts/repair_timing_post_place.tcl +++ b/flow/scripts/repair_timing_post_place.tcl @@ -8,14 +8,14 @@ set_placement_padding -global \ -right $::env(CELL_PAD_IN_SITES_DETAIL_PLACEMENT) puts "Repair setup and hold violations" -estimate_parasitics -placement +log_cmd estimate_parasitics -placement log_cmd repair_timing -repair_tns $::env(TNS_END_PERCENT) # Legalize placement after timing repair detailed_placement puts "Estimate parasitics" -estimate_parasitics -placement +log_cmd estimate_parasitics -placement report_metrics 3 "place repair timing" true false -write_db $::env(RESULTS_DIR)/3_6_place_repair_timing.odb +orfs_write_db $::env(RESULTS_DIR)/3_6_place_repair_timing.odb diff --git a/flow/scripts/resize.tcl b/flow/scripts/resize.tcl index 50276a85ec..44f7a410dc 100644 --- a/flow/scripts/resize.tcl +++ b/flow/scripts/resize.tcl @@ -3,7 +3,7 @@ source $::env(SCRIPTS_DIR)/load.tcl erase_non_stage_variables place load_design 3_3_place_gp.odb 2_floorplan.sdc -estimate_parasitics -placement +log_cmd estimate_parasitics -placement set instance_count_before [sta::network_leaf_instance_count] set pin_count_before [sta::network_leaf_pin_count] @@ -32,4 +32,4 @@ report_metrics 3 "resizer" true false puts "Instance count before $instance_count_before, after [sta::network_leaf_instance_count]" puts "Pin count before $pin_count_before, after [sta::network_leaf_pin_count]" -write_db $::env(RESULTS_DIR)/3_4_place_resized.odb +orfs_write_db $::env(RESULTS_DIR)/3_4_place_resized.odb diff --git a/flow/scripts/save_images.tcl b/flow/scripts/save_images.tcl index 5dec935009..ed4618a99e 100644 --- a/flow/scripts/save_images.tcl +++ b/flow/scripts/save_images.tcl @@ -37,7 +37,7 @@ save_image -resolution $resolution $::env(REPORTS_DIR)/final_routing.webp # The placement view without routing gui::set_display_controls "Shape Types/Routing/*" visible false -gui::set_display_controls "Instances/Physical/*" visible false +gui::set_display_controls "Instances/Physical/Fill cell" visible false gui::set_display_controls "Misc/Instances/*" visible false save_image -resolution $resolution $::env(REPORTS_DIR)/final_placement.webp @@ -106,4 +106,15 @@ gui::set_display_controls "Heat Maps/Routing Congestion" visible true save_image -resolution $resolution $::env(REPORTS_DIR)/final_congestion.webp +# The worst timing path view +gui::set_display_controls "Heat Maps/Routing Congestion" visible false +gui::set_display_controls "Timing Path/*" visible true +gui::set_display_controls "Nets/*" visible false +gui::set_display_controls "Instances/*" visible true +gui::set_display_controls "Shape Types/Routing/*" visible false + +gui::show_worst_path +save_image -resolution $resolution $::env(REPORTS_DIR)/final_worst_path.webp +gui::set_display_controls "Timing Path/*" visible false + gui::restore_display_controls diff --git a/flow/scripts/synth.tcl b/flow/scripts/synth.tcl index 9f69db3191..8554f6d61c 100644 --- a/flow/scripts/synth.tcl +++ b/flow/scripts/synth.tcl @@ -1,3 +1,36 @@ +# +# Extracts and returns module names from Verilog file +# +proc get_module_names { file_path } { + set module_list [list] + if { [catch { set fid [open $file_path r] } err] } { + error "Failed to open file $file_path: $err" + } + + set regex {^[ \t]*module[ \t]+([A-Za-z_$][A-Za-z0-9_$]*)} + + while { [gets $fid line] >= 0 } { + if { [regexp -nocase $regex $line match_all module_name] } { + lappend module_list $module_name + } + } + + close $fid + return $module_list +} + +# +# Builds dfflegalize arg list +# +proc get_dfflegalize_args { file_path } { + set legalize_args [list] + set module_names [get_module_names $file_path] + foreach module_name $module_names { + lappend legalize_args -cell $module_name x + } + return $legalize_args +} + source $::env(SCRIPTS_DIR)/synth_preamble.tcl read_checkpoint $::env(RESULTS_DIR)/1_1_yosys_canonicalize.rtlil @@ -55,6 +88,34 @@ if { !$::env(SYNTH_HIERARCHICAL) } { synth -flatten -run coarse:fine {*}$synth_full_args } + +if { $::env(SYNTH_MOCK_LARGE_MEMORIES) } { + memory_collect + set select [tee -q -s result.string select -list t:\$mem_v2] + set report_file [open $::env(REPORTS_DIR)/synth_mocked_memories.txt "w"] + foreach path [split [string trim $select] "\n"] { + set index [string first "/" $path] + set module [string range $path 0 [expr { $index - 1 }]] + set instance [string range $path [expr { $index + 1 }] end] + + set width [rtlil::get_param -uint $module $instance WIDTH] + set size [rtlil::get_param -uint $module $instance SIZE] + set nbits [expr $width * $size] + puts "Memory $path has dimensions $size x $width = $nbits" + if { $nbits > $::env(SYNTH_MEMORY_MAX_BITS) } { + rtlil::set_param -uint $module $instance SIZE 1 + puts "Shrunk memory $path from $size rows to 1" + puts -nonewline $report_file "$module:\n width: $width\n size: $size\n" + if { $::env(SYNTH_KEEP_MOCKED_MEMORIES) } { + select -module $module + setattr -mod -set keep_hierarchy 1 + select -clear + } + } + } + close $report_file +} + json -o $::env(RESULTS_DIR)/mem.json # Run report and check here so as to fail early if this synthesis run is doomed exec -- $::env(PYTHON_EXE) $::env(SCRIPTS_DIR)/mem_dump.py \ @@ -92,7 +153,16 @@ renames -wire opt -purge # Technology mapping of adders -if { [env_var_exists_and_non_empty ADDER_MAP_FILE] } { +if { + [env_var_exists_and_non_empty ADDER_MAP_FILE] && + ( + (![env_var_exists_and_non_empty SYNTH_WRAPPED_OPERATORS] && + ![env_var_exists_and_non_empty SWAP_ARITH_OPERATORS]) || + (([env_var_exists_and_non_empty SYNTH_WRAPPED_OPERATORS] || + [env_var_exists_and_non_empty SWAP_ARITH_OPERATORS]) && + ![design_has_extracted_operators]) + ) +} { # extract the full adders extract_fa # map full adders @@ -111,6 +181,10 @@ if { [env_var_exists_and_non_empty LATCH_MAP_FILE] } { # dfflibmap only supports one liberty file if { [env_var_exists_and_non_empty DFF_LIB_FILE] } { dfflibmap -liberty $::env(DFF_LIB_FILE) {*}$lib_dont_use_args +} elseif { [env_var_exists_and_non_empty DFF_MAP_FILE] } { + set legalize_args [get_dfflegalize_args $::env(DFF_MAP_FILE)] + dfflegalize {*}$legalize_args + techmap -map $::env(DFF_MAP_FILE) } else { dfflibmap {*}$lib_args {*}$lib_dont_use_args } @@ -144,8 +218,10 @@ hilomap -singleton \ -hicell {*}$::env(TIEHI_CELL_AND_PORT) \ -locell {*}$::env(TIELO_CELL_AND_PORT) -# Insert buffer cells for pass through wires -insbuf -buf {*}$::env(MIN_BUF_CELL_AND_PORTS) +if { $::env(SYNTH_INSBUF) } { + # Insert buffer cells for pass through wires + insbuf -buf {*}$::env(MIN_BUF_CELL_AND_PORTS) +} # Reports tee -o $::env(REPORTS_DIR)/synth_check.txt check diff --git a/flow/scripts/synth_canonicalize.tcl b/flow/scripts/synth_canonicalize.tcl index f7d4c44657..4ba62a4523 100644 --- a/flow/scripts/synth_canonicalize.tcl +++ b/flow/scripts/synth_canonicalize.tcl @@ -1,16 +1,16 @@ source $::env(SCRIPTS_DIR)/synth_preamble.tcl read_design_sources -dict for {key value} [env_var_or_empty VERILOG_TOP_PARAMS] { - # Apply toplevel parameters - chparam -set $key $value $::env(DESIGN_NAME) -} - hierarchy -check -top $::env(DESIGN_NAME) source_env_var_if_exists SYNTH_CANONICALIZE_TCL # Get rid of unused modules opt_clean -purge +if { $::env(SYNTH_REPEATABLE_BUILD) } { + # avoid source line and path info affecting the hash + setattr -unset src * + setattr -mod -unset src * +} # The hash of this file will not change if files not part of synthesis do not change write_rtlil $::env(RESULTS_DIR)/1_1_yosys_canonicalize.rtlil diff --git a/flow/scripts/synth_odb.tcl b/flow/scripts/synth_odb.tcl index 8b7af86e0f..ad56b542e8 100644 --- a/flow/scripts/synth_odb.tcl +++ b/flow/scripts/synth_odb.tcl @@ -1,16 +1,11 @@ utl::set_metrics_stage "floorplan__{}" source $::env(SCRIPTS_DIR)/load.tcl erase_non_stage_variables synth -load_design 1_synth.v 1_synth.sdc +load_design 1_2_yosys.v 1_2_yosys.sdc -write_db $::env(RESULTS_DIR)/1_3_synth.odb +orfs_write_db $::env(RESULTS_DIR)/1_synth.odb # Canonicalize 1_synth.sdc. The original SDC_FILE provided by # the user could have dependencies, such as sourcing util.tcl, # which are read in here and a canonicalized version is written # out by OpenSTA that has no dependencies. -write_sdc -no_timestamp $::env(RESULTS_DIR)/1_3_synth.sdc - -# Final output of the synthesis stage, the other files are written out for -# consistency and logging of .odb hashes -exec cp $::env(RESULTS_DIR)/1_3_synth.sdc $::env(RESULTS_DIR)/1_synth.sdc -exec cp $::env(RESULTS_DIR)/1_3_synth.odb $::env(RESULTS_DIR)/1_synth.odb +orfs_write_sdc $::env(RESULTS_DIR)/1_synth.sdc diff --git a/flow/scripts/synth_preamble.tcl b/flow/scripts/synth_preamble.tcl index a372312757..d8f98c8f69 100644 --- a/flow/scripts/synth_preamble.tcl +++ b/flow/scripts/synth_preamble.tcl @@ -44,11 +44,39 @@ proc read_design_sources { } { } if { [env_var_equals SYNTH_HDL_FRONTEND slang] } { - # slang requires all files at once plugin -i slang - yosys read_slang -D SYNTHESIS --keep-hierarchy --compat=vcs \ - --ignore-assertions --no-implicit-memories --top $::env(DESIGN_NAME) \ - {*}$vIdirsArgs {*}$::env(VERILOG_FILES) {*}[env_var_or_empty VERILOG_DEFINES] + + set slang_args [list \ + -D SYNTHESIS --keep-hierarchy --compat=vcs --ignore-assertions --top $::env(DESIGN_NAME) \ + {*}$vIdirsArgs {*}[env_var_or_empty VERILOG_DEFINES]] + + # slang requires all files at once + lappend slang_args {*}$::env(VERILOG_FILES) + + # Add clock gate cell definition, if available + if { [env_var_exists_and_non_empty CLKGATE_MAP_FILE] } { + lappend slang_args $::env(CLKGATE_MAP_FILE) + } + + # Apply top-level parameters + dict for {key value} [env_var_or_empty VERILOG_TOP_PARAMS] { + lappend slang_args -G "$key=$value" + } + + # Apply module blackboxing based on module names as they appear + # in the input, that is before any module name mangling done + # by elaboration and synthesis + if { [env_var_exists_and_non_empty SYNTH_BLACKBOXES] } { + foreach m $::env(SYNTH_BLACKBOXES) { + lappend slang_args --blackboxed-module "$m" + } + } + + # Add user arguments + lappend slang_args {*}$::env(SYNTH_SLANG_ARGS) + + yosys read_slang {*}$slang_args + # Workaround for yosys-slang#119 setattr -unset init } elseif { [env_var_equals SYNTH_HDL_FRONTEND verific] } { @@ -60,6 +88,15 @@ proc read_design_sources { } { } verific -sv2012 {*}$::env(VERILOG_FILES) verific -import -no-split-complex-ports $::env(DESIGN_NAME) + + dict for {key value} [env_var_or_empty VERILOG_TOP_PARAMS] { + # Apply top-level parameters + chparam -set $key $value $::env(DESIGN_NAME) + } + + if { [env_var_exists_and_non_empty SYNTH_BLACKBOXES] } { + error "Non-empty SYNTH_BLACKBOXES unsupported with HDL frontend \"verific\"" + } } elseif { ![env_var_exists_and_non_empty SYNTH_HDL_FRONTEND] } { verilog_defaults -push if { [env_var_exists_and_non_empty VERILOG_DEFINES] } { @@ -68,21 +105,25 @@ proc read_design_sources { } { foreach file $::env(VERILOG_FILES) { read_verilog -defer -sv {*}$vIdirsArgs $file } + # Read platform specific mapfile for OPENROAD_CLKGATE cells + if { [env_var_exists_and_non_empty CLKGATE_MAP_FILE] } { + read_verilog -defer $::env(CLKGATE_MAP_FILE) + } verilog_defaults -pop - } else { - error "Unrecognized HDL frontend: $::env(SYNTH_HDL_FRONTEND)" - } - # Read platform specific mapfile for OPENROAD_CLKGATE cells - if { [env_var_exists_and_non_empty CLKGATE_MAP_FILE] } { - read_verilog -defer $::env(CLKGATE_MAP_FILE) - } + dict for {key value} [env_var_or_empty VERILOG_TOP_PARAMS] { + # Apply top-level parameters + chparam -set $key $value $::env(DESIGN_NAME) + } - if { [env_var_exists_and_non_empty SYNTH_BLACKBOXES] } { - hierarchy -check -top $::env(DESIGN_NAME) - foreach m $::env(SYNTH_BLACKBOXES) { - blackbox $m + if { [env_var_exists_and_non_empty SYNTH_BLACKBOXES] } { + hierarchy -check -top $::env(DESIGN_NAME) + foreach m $::env(SYNTH_BLACKBOXES) { + blackbox $m + } } + } else { + error "Unrecognized HDL frontend: $::env(SYNTH_HDL_FRONTEND)" } } diff --git a/flow/scripts/synth_wrap_operators.tcl b/flow/scripts/synth_wrap_operators.tcl index f3510312e3..bd66ae3348 100644 --- a/flow/scripts/synth_wrap_operators.tcl +++ b/flow/scripts/synth_wrap_operators.tcl @@ -1,5 +1,5 @@ # Set arithmetic operator modules. Default is the first module in the list. -set deferred_cells { +set deferred_cells [list \ { \$alu ALU_{A_WIDTH}_{A_SIGNED}_{B_WIDTH}_{B_SIGNED}_{Y_WIDTH}{%unused} @@ -7,14 +7,12 @@ set deferred_cells { {KOGGE_STONE -map +/choices/kogge-stone.v} {SKLANSKY -map +/choices/sklansky.v} {BRENT_KUNG} - } - { - \$macc - MACC_{CONFIG}_{Y_WIDTH}{%unused} - {BOOTH -max_iter 1 -map ../flow/scripts/synth_wrap_operators-booth.v} - {BASE -map +/choices/han-carlson.v} - } -} + } \ + [list \ + \$macc \ + MACC_\{CONFIG\}_\{Y_WIDTH\}\{%unused\} \ + [list BOOTH -max_iter 1 -map $::env(SCRIPTS_DIR)/synth_wrap_operators-booth.v] \ + {BASE -map +/choices/han-carlson.v}]] # Reorder the modules based on envar proc reorder_deferred_cells { deferred_cells_var index env_var } { @@ -74,11 +72,12 @@ foreach info $deferred_cells { # make per-architecture copies of the unmapped module foreach modname [tee -q -s result.string select -list-mod A:arithmetic_operator A:copy_pending %i] { # tclint-disable-line line-length setattr -mod -unset copy_pending $modname + set base [rtlil::get_attr -string -mod $modname implements_operator] + setattr -set implements_operator \"$base\" t:$modname # iterate over non-default architectures foreach arch [lrange $info 3 end] { set suffix [lindex $arch 0] - set base [rtlil::get_attr -string -mod $modname implements_operator] set newname ${base}_${suffix} yosys copy $modname $newname yosys setattr -mod -set architecture \"$suffix\" $newname @@ -109,3 +108,8 @@ chformal -remove setattr -mod -set abc9_script {"+&dch;&nf -R 5;"} A:arithmetic_operator setattr -mod -set abc9_box 1 A:arithmetic_operator techmap -map +/techmap.v -map +/choices/han-carlson.v + +proc design_has_extracted_operators { } { + set no_extracted [yosys select -count a:implements_operator] + return [expr { [lindex $no_extracted 0] > 0 }] +} diff --git a/flow/scripts/tapcell.tcl b/flow/scripts/tapcell.tcl index eb00d11e23..cbd4ede9fc 100644 --- a/flow/scripts/tapcell.tcl +++ b/flow/scripts/tapcell.tcl @@ -9,4 +9,4 @@ if { [env_var_exists_and_non_empty TAPCELL_TCL] } { cut_rows } -write_db $::env(RESULTS_DIR)/2_3_floorplan_tapcell.odb +orfs_write_db $::env(RESULTS_DIR)/2_3_floorplan_tapcell.odb diff --git a/flow/scripts/util.tcl b/flow/scripts/util.tcl index a6ad11bbb0..04b4d3727e 100644 --- a/flow/scripts/util.tcl +++ b/flow/scripts/util.tcl @@ -145,6 +145,9 @@ proc find_macros { } { } proc erase_non_stage_variables { stage_name } { + if { $::env(KEEP_VARS) } { + return + } # "$::env(SCRIPTS_DIR)/stage_variables.py stage_name" returns list of # variables to erase. # @@ -193,10 +196,13 @@ proc source_env_var_if_exists { env_var } { # will be default and this code will be deleted. proc hier_options { } { if { - [env_var_exists_and_non_empty SYNTH_WRAPPED_OPERATORS] || - [env_var_exists_and_non_empty SWAP_ARITH_OPERATORS] || - $::env(OPENROAD_HIERARCHICAL) + ([env_var_exists_and_non_empty SYNTH_WRAPPED_OPERATORS] || + [env_var_exists_and_non_empty SWAP_ARITH_OPERATORS]) && + !$::env(OPENROAD_HIERARCHICAL) } { + error "SYNTH_WRAPPED_OPERATORS or SWAP_ARITH_OPERATORS require OPENROAD_HIERARCHICAL to be set." + } + if { $::env(OPENROAD_HIERARCHICAL) } { return "-hier" } else { return "" @@ -238,3 +244,17 @@ proc find_physical_only_masters { } { } return $physical_only_masters } + +proc orfs_write_db { output_file } { + if { !$::env(WRITE_ODB_AND_SDC_EACH_STAGE) } { + return + } + log_cmd write_db $output_file +} + +proc orfs_write_sdc { output_file } { + if { !$::env(WRITE_ODB_AND_SDC_EACH_STAGE) } { + return + } + log_cmd write_sdc -no_timestamp $output_file +} diff --git a/flow/scripts/variables.mk b/flow/scripts/variables.mk index 81de8d10e8..ea0cbd1b7c 100644 --- a/flow/scripts/variables.mk +++ b/flow/scripts/variables.mk @@ -213,7 +213,6 @@ vars: $(UTILS_DIR)/generate-vars.sh $(OBJECTS_DIR)/vars .PHONY: print-% -# Print any variable, for instance: make print-DIE_AREA print-%: # HERE BE DRAGONS! # @@ -223,7 +222,8 @@ print-%: # # We have to use $(file ...) because we want to be able # to print variables that contain newlines. - $(file >/tmp/print_tmp$$,$($*)) - @echo -n "$* = " - @cat /tmp/print_tmp$$ - @rm /tmp/print_tmp$$ + $(eval TEMP_FILE := $(shell mktemp /tmp/print_tmp.XXXXXX)) + @$(file >$(TEMP_FILE),$($*)) + @echo -n "$*: " + @cat $(TEMP_FILE) + @rm -f $(TEMP_FILE) diff --git a/flow/scripts/variables.yaml b/flow/scripts/variables.yaml index a7adc03f56..9483713f27 100644 --- a/flow/scripts/variables.yaml +++ b/flow/scripts/variables.yaml @@ -174,9 +174,70 @@ SYNTH_HIERARCHICAL: SYNTH_MEMORY_MAX_BITS: description: > Maximum number of bits for memory synthesis. + + Ideally, real RAM or realistic fakeram should be used for RAMs + much larger than 1024 bits. + + To temporarily ignore the RAM concerns and investigate other + aspects of the design, consider setting `SYNTH_MOCK_LARGE_MEMORIES=1`, + or adjusting `SYNTH_MEMORY_MAX_BITS`. default: 4096 stages: - synth +SYNTH_MOCK_LARGE_MEMORIES: + description: > + Reduce Yosys inferred memories larger than SYNTH_MEMORY_MAX_BITS to 1 row. + + Yosys will generally infer memories from behavioral Verilog code, whether + the memories are in standalone modules or instantiated within some + larger module. + + fakeram and empty Verilog memories(blackboxes) of memories will not + be inferred memories by Yosys and are therefore not affected by + this variable. + + This is useful and convenient to separate the concern of instantiating + and placing memories from investigating other issues with a design, + though it comes at the expense of the increased accuracy that using + realistic fakemem would provide. + + Memories with a single 1 row will of course have unrealistically good + timing and area characteristics, but timing will still correctly terminate + in a register. + + Large port memories, typically register files, will still have the + retain a lot of the port logic that can be useful to investigate issues. + + This can be especially useful during development of designs where the + behavioral model comes first and suitable memories are matched up + when the design RTL is stable. + + A typical use case would be Chisel which will generate a behavioral model + for a memories with the required clocks, ports, etc. in addition to a + computer readable file with the specification of the memories that + is used to + [automatically](https://chipyard.readthedocs.io/en/stable/Tools/Barstools.html/) + match up suitable memory macros later in the flow. + + During an architectural screening study, a large range of memory + configurations can be investigated quickly with this option, + without getting bogged down in the concern of how to realize the + memories in silicon for emphemral RTL configurations that exist + only long enough to run through the ORFS flow to create a table + of some characteristics of a design configuration. + default: 0 + stages: + - synth +SYNTH_KEEP_MOCKED_MEMORIES: + description: > + When `SYNTH_MOCK_LARGE_MEMORIES=1`, setting this to 1, + will keep mocked memories (not flattening them). + + This preserves some of the access logic complexity and + avoids optimizations outside of the mocked memory. + default: 1 + stages: + - synth SYNTH_HDL_FRONTEND: description: > Select an alternative language frontend to ingest the design. Available option @@ -184,10 +245,19 @@ SYNTH_HDL_FRONTEND: command. stages: - synth +SYNTH_SLANG_ARGS: + description: > + Additional arguments passed to the slang frontend during synthesis. + stages: + - synth + default: "" SYNTH_BLACKBOXES: description: > List of cells treated as a black box by Yosys. With Bazel, this can be used to run synthesis in parallel for the large modules of the design. + + Non-existant modules are ignored silently, useful when listing modules + statically, even if modules come and go dynamically. stages: - synth SYNTH_NETLIST_FILES: @@ -225,19 +295,44 @@ SYNTH_RETIME_MODULES: optimal distribution of registers on long pipelines. See OR discussion #8080. stages: - synth +SYNTH_REPEATABLE_BUILD: + description: > + License to prune anything that makes builds less repeatable, typically + used with Bazel to ensure that builds are bit-for-bit identical so that + caching works optimally. + + Removes debug information that encodes paths, timestamps, etc. + stages: + - synth + default: 0 +SYNTH_INSBUF: + description: > + Insert input buffers on top-level input ports during synthesis. + + Useful to disable when doing parallel synthesis and + concatenating netlists later as we're generating netlists + of submodules. + stages: + - synth + default: 1 +DFF_MAP_FILE: + description: | + Optional mapping file supplied to Yosys to map D flip-flops + stages: + - synth LATCH_MAP_FILE: description: | - List of latches treated as a black box by Yosys. + Optional mapping file supplied to Yosys to map latches stages: - synth CLKGATE_MAP_FILE: description: | - List of cells for gating clock treated as a black box by Yosys. + Optional mapping file supplied to Yosys to map clock gating cells stages: - synth ADDER_MAP_FILE: description: | - List of adders treated as a black box by Yosys. + Optional mapping file supplied to Yosys to map adders stages: - synth TIEHI_CELL_AND_PORT: @@ -330,6 +425,11 @@ DONT_BUFFER_PORTS: stages: - place default: 0 +BUFFER_PORTS_ARGS: + description: > + Specify arguments to the buffer_ports call during placement. Only used if DONT_BUFFER_PORTS=0. + stages: + - place REMOVE_ABC_BUFFERS: description: > Remove abc buffers from the netlist. If timing repair in floorplanning is @@ -352,6 +452,10 @@ PLACE_SITE: - floorplan type: string tunable: 1 +LAYER_PARASITICS_FILE: + description: | + Path to per layer parasitics file. Defaults to $(PLATFORM_DIR)/setRC.tcl. + type: string TAPCELL_TCL: description: | Path to Endcap and Welltie cells file. @@ -479,6 +583,8 @@ GLOBAL_PLACEMENT_ARGS: description: > Use additional tuning parameters during global placement other than default args defined in global_place.tcl. + stages: + - place ENABLE_DPO: description: | Enable detail placement with improve_placement feature. @@ -499,6 +605,30 @@ GPL_ROUTABILITY_DRIVEN: stages: - place default: 1 +MIN_PLACE_STEP_COEF: + description: > + Sets the minimum phi coefficient (pcof_min / µ_k Lower Bound) for global + placement optimization. This parameter controls the step size lower bound + in the RePlAce Nesterov optimization algorithm. Lower values may improve + convergence but can increase runtime. + Valid range: 0.95-1.05 + default: 0.95 + stages: + - place + tunable: 1 + type: float +MAX_PLACE_STEP_COEF: + description: > + Sets the maximum phi coefficient (pcof_max / µ_k Upper Bound) for global + placement optimization. This parameter controls the step size upper bound + in the RePlAce Nesterov optimization algorithm. Higher values allow more + aggressive optimization but may risk divergence. + Valid range: 1.00-1.20 + default: 1.05 + stages: + - place + tunable: 1 + type: float CAP_MARGIN: description: > Specifies a capacitance margin when fixing max capacitance violations. This @@ -781,10 +911,14 @@ SYNTH_KEEP_MODULES: SYNTH_ARGS: description: | Optional synthesis variables for yosys. + stages: + - synth SYNTH_HIER_SEPARATOR: description: | Separator used for the synthesis flatten stage. default: . + stages: + - synth SYNTH_OPT_HIER: description: | Optimize constants across hierarchical boundaries. @@ -792,13 +926,15 @@ SYNTH_OPT_HIER: - synth VERILOG_TOP_PARAMS: description: | - Apply toplevel params (if exist). + Apply toplevel params (if exist). Passed in as a list of key value pairs + in tcl syntax; separated by spaces: PARAM1 VALUE1 PARAM2 VALUE2 stages: - synth CORE_ASPECT_RATIO: description: > - The core aspect ratio (height / width). This value is ignored if - `CORE_UTILIZATION` is undefined. + The core aspect ratio (height / width). + + This variable is only used when `CORE_UTILIZATION` is set. stages: - floorplan default: 1.0 @@ -809,8 +945,9 @@ CORE_MARGIN: The margin between the core area and die area, specified 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}`. This variable is ignored if `CORE_UTILIZATION` - is undefined. + `{bottom top left right}`. + + This variable is only used when `CORE_UTILIZATION` is set. stages: - floorplan default: 1.0 @@ -995,13 +1132,6 @@ RTLMP_NOTCH_WT: default: 10.0 stages: - floorplan -RTLMP_DEAD_SPACE: - description: > - Specifies the target dead space percentage, which influences the - utilization of a cluster. - default: 0.05 - stages: - - floorplan RTLMP_RPT_DIR: description: > Path to the directory where reports are saved. @@ -1025,14 +1155,23 @@ RTLMP_FENCE_UX: description: > Defines the upper right X coordinate for the global fence bounding box in microns. - default: 100000000.0 + default: 0.0 stages: - floorplan RTLMP_FENCE_UY: description: > Defines the upper right Y coordinate for the global fence bounding box in microns. - default: 100000000.0 + default: 0.0 + stages: + - floorplan +RTLMP_DATA_FLOW_DRIVEN: + description: > + Specifies whether the macro placer should use data-flow driven macro placement. + Data-flow driven works by adding a wire length component that takes into account + the data paths of the design. This optional can increase run time significantly + for large designs. + default: 1 stages: - floorplan RTLMP_ARGS: @@ -1042,7 +1181,7 @@ RTLMP_ARGS: - floorplan GDS_ALLOW_EMPTY: description: > - Regular expression of module names of macros that have no .gds file + Single regular expression of module names of macros that have no .gds file stages: - final RUN_SCRIPT: @@ -1138,3 +1277,30 @@ MAX_REPAIR_TIMING_ITER: - floorplan - grt - place +NUM_CORES: + description: > + Passed to `openroad -threads $(NUM_CORES)`, defaults to numbers + of cores in system as determined by system specific code in Makefile, + `nproc` is tried first. + + OpenROAD does not limit itself to this number of cores across + OpenROAD running instances, which can lead to overprovisioning + in contexts such as bazel-orfs where there could be many + routing, or place jobs running at the same time. + stages: + - All stages +KEEP_VARS: + description: > + Feature toggle to keep intermediate variables during the flow. + This is useful for the single-run flow, where all stages of the flow + are run in a single OpenROAD instance. + default: 0 + stages: + - All stages +WRITE_ODB_AND_SDC_EACH_STAGE: + description: > + Save out .sdc and .odb file after each stage, useful to disable + when using a single OpenROAD instance to run all stages of the flow. + stages: + - All stages + default: 1 diff --git a/flow/util/appendStatsToDb.py b/flow/util/appendStatsToDb.py index a4ef3da524..dbf73ac177 100755 --- a/flow/util/appendStatsToDb.py +++ b/flow/util/appendStatsToDb.py @@ -14,7 +14,6 @@ import uuid from collections import OrderedDict - # Parse and validate arguments # ============================================================================== parser = argparse.ArgumentParser(description="Appends test metadata to master database") diff --git a/flow/util/genMassive.py b/flow/util/genMassive.py index c05da0926e..14260a48b0 100644 --- a/flow/util/genMassive.py +++ b/flow/util/genMassive.py @@ -11,7 +11,6 @@ import itertools import glob - PUBLIC = ["nangate45", "sky130hd", "sky130hs", "asap7"] # The number of generated config files into diff --git a/flow/util/genMetrics.py b/flow/util/genMetrics.py index 6453f5dd00..6090714532 100755 --- a/flow/util/genMetrics.py +++ b/flow/util/genMetrics.py @@ -346,6 +346,10 @@ def extract_metrics( else: metrics_dict["total_time"] = str(total) + metrics_dict = { + key.replace(":", "__"): value for key, value in metrics_dict.items() + } + if hier_json: # Convert the Metrics dictionary to hierarchical format by stripping # the stage as a 'key' diff --git a/flow/util/genReport.py b/flow/util/genReport.py index 402c0efde4..f08fdd20e6 100755 --- a/flow/util/genReport.py +++ b/flow/util/genReport.py @@ -2,6 +2,7 @@ """ Generate reports from current logs """ + import argparse import os import re diff --git a/flow/util/genRuleFile.py b/flow/util/genRuleFile.py index d0d6ddd0e4..2edecdff0f 100755 --- a/flow/util/genRuleFile.py +++ b/flow/util/genRuleFile.py @@ -200,30 +200,6 @@ def gen_rule_file( "round_value": True, "compare": "<=", }, - "detailedroute__timing__setup__ws": { - "mode": "period_padding", - "padding": 5, - "round_value": False, - "compare": ">=", - }, - "detailedroute__timing__setup__tns": { - "mode": "period_padding", - "padding": 20, - "round_value": False, - "compare": ">=", - }, - "detailedroute__timing__hold__ws": { - "mode": "period_padding", - "padding": 5, - "round_value": False, - "compare": ">=", - }, - "detailedroute__timing__hold__tns": { - "mode": "period_padding", - "padding": 20, - "round_value": False, - "compare": ">=", - }, # finish "finish__timing__setup__ws": { "mode": "period_padding", @@ -298,6 +274,10 @@ def gen_rule_file( matching_fields.append(pattern) for field in matching_fields: + # Replace ':' with '__' as the dashboard DB does not accept + # ':' in # field names. + if ":" in field: + field = field.replace(":", "__") processed_fields.add(field) if isinstance(metrics[field], str): print(f"[WARNING] Skipping string field {field} = {metrics[field]}") diff --git a/flow/util/plot_congestion.py b/flow/util/plot_congestion.py index da6ce3056b..dfa0e600a1 100644 --- a/flow/util/plot_congestion.py +++ b/flow/util/plot_congestion.py @@ -4,7 +4,6 @@ import re import os - sweep = sys.argv[1] output = sys.argv[2] remainder = sys.argv[3:] diff --git a/jenkins/public_nightly.Jenkinsfile b/jenkins/public_nightly.Jenkinsfile index faea6431e4..02c1261812 100644 --- a/jenkins/public_nightly.Jenkinsfile +++ b/jenkins/public_nightly.Jenkinsfile @@ -55,18 +55,22 @@ node { buildBins(DOCKER_IMAGE, '--local --no_init --latest'); } - stage('Run Tests') { - if (env.CHANGE_BRANCH && env.CHANGE_BRANCH.contains('ci-dev')) { - runTests(DOCKER_IMAGE, 'dev'); - } else { - runTests(DOCKER_IMAGE, 'nightly'); + try { + stage('Run Tests') { + if (env.CHANGE_BRANCH && env.CHANGE_BRANCH.contains('ci-dev')) { + runTests(DOCKER_IMAGE, 'dev'); + } else { + runTests(DOCKER_IMAGE, 'nightly'); + } + } + } catch (e) { + throw e + } finally { + stage ('Cleanup and Reporting') { + env.CHANGE_BRANCH = 'nightly' + env.BRANCH_NAME = 'nightly' + finalReport(DOCKER_IMAGE); } - } - - stage ('Cleanup and Reporting') { - env.CHANGE_BRANCH = 'nightly' - env.BRANCH_NAME = 'nightly' - finalReport(DOCKER_IMAGE); } } diff --git a/jenkins/public_tests_all.Jenkinsfile b/jenkins/public_tests_all.Jenkinsfile index 03810b505c..267804ea5a 100644 --- a/jenkins/public_tests_all.Jenkinsfile +++ b/jenkins/public_tests_all.Jenkinsfile @@ -52,16 +52,20 @@ node { buildBins(DOCKER_IMAGE); } - stage('Run Tests') { - if (env.CHANGE_BRANCH && env.CHANGE_BRANCH.contains('ci-dev')) { - runTests(DOCKER_IMAGE, 'dev'); - } else { - runTests(DOCKER_IMAGE, 'pr'); + try { + stage('Run Tests') { + if (env.CHANGE_BRANCH && env.CHANGE_BRANCH.contains('ci-dev')) { + runTests(DOCKER_IMAGE, 'dev'); + } else { + runTests(DOCKER_IMAGE, 'pr'); + } + } + } catch (e) { + throw e + } finally { + stage ('Cleanup and Reporting') { + finalReport(DOCKER_IMAGE); } - } - - stage ('Cleanup and Reporting') { - finalReport(DOCKER_IMAGE); } } diff --git a/tools/AutoTuner/src/autotuner/distributed.py b/tools/AutoTuner/src/autotuner/distributed.py index c5b07dc74c..6a4adecac5 100644 --- a/tools/AutoTuner/src/autotuner/distributed.py +++ b/tools/AutoTuner/src/autotuner/distributed.py @@ -92,14 +92,15 @@ read_config, read_metrics, prepare_ray_server, + calculate_score, + ERROR_METRIC, CONSTRAINTS_SDC, FASTROUTE_TCL, ) +from autotuner.tensorboard_logger import TensorBoardLogger # Name of the final metric METRIC = "metric" -# The worst of optimized metric -ERROR_METRIC = 9e99 # Path to the FLOW_HOME directory ORFS_FLOW_DIR = os.path.abspath( os.path.join(os.path.dirname(__file__), "../../../../flow") @@ -154,7 +155,7 @@ def step(self): install_path=INSTALL_PATH, ) self.step_ += 1 - (score, effective_clk_period, num_drc, die_area) = self.evaluate( + score, effective_clk_period, num_drc, die_area = self.evaluate( read_metrics(metrics_file, args.stop_stage) ) # Feed the score back to Tune. @@ -172,16 +173,7 @@ def evaluate(self, metrics): It can change in any form to minimize the score (return value). Default evaluation function optimizes effective clock period. """ - error = "ERR" in metrics.values() - not_found = "N/A" in metrics.values() - if error or not_found: - return (ERROR_METRIC, "-", "-", "-") - effective_clk_period = metrics["clk_period"] - metrics["worst_slack"] - num_drc = metrics["num_drc"] - gamma = effective_clk_period / 10 - score = effective_clk_period - score = score * (100 / self.step_) + gamma * num_drc - return (score, effective_clk_period, num_drc, metrics["die_area"]) + return calculate_score(metrics, step=self.step_) def _is_valid_config(self, config): """ @@ -566,25 +558,56 @@ def sweep(): else: repo_dir = os.path.abspath(os.path.join(ORFS_FLOW_DIR, "..")) print(f"[INFO TUN-0012] Log folder {LOCAL_DIR}.") + + tb_log_dir = os.path.join(LOCAL_DIR, args.experiment) + print( + f"[INFO TUN-0034] TensorBoard logging enabled. Run: tensorboard --logdir={tb_log_dir}" + ) + + tb_logger = TensorBoardLogger.remote(log_dir=tb_log_dir) + queue = Queue() parameter_list = list() for name, content in config_dict.items(): - if not isinstance(content, list): + if isinstance(content, dict) and content.get("type") == "string": + if "values" not in content: + print( + f"[ERROR TUN-0016] {name} string parameter missing 'values' field." + ) + sys.exit(1) + if not isinstance(content["values"], list) or len(content["values"]) == 0: + print(f"[ERROR TUN-0017] {name} 'values' must be a non-empty list.") + sys.exit(1) + parameter_list.append([{name: i} for i in content["values"]]) + elif isinstance(content, list): + if content[-1] == 0: + print("[ERROR TUN-0014] Sweep does not support step value zero.") + sys.exit(1) + parameter_list.append([{name: i} for i in np.arange(*content)]) + else: print(f"[ERROR TUN-0015] {name} sweep is not supported.") sys.exit(1) - if content[-1] == 0: - print("[ERROR TUN-0014] Sweep does not support step value zero.") - sys.exit(1) - parameter_list.append([{name: i} for i in np.arange(*content)]) parameter_list = list(product(*parameter_list)) for parameter in parameter_list: temp = dict() for value in parameter: temp.update(value) - queue.put([args, repo_dir, temp, SDC_ORIGINAL, FR_ORIGINAL, INSTALL_PATH]) + queue.put( + [ + args, + repo_dir, + temp, + SDC_ORIGINAL, + FR_ORIGINAL, + INSTALL_PATH, + tb_logger, + ] + ) workers = [consumer.remote(queue) for _ in range(args.jobs)] print("[INFO TUN-0009] Waiting for results.") ray.get(workers) + ray.get(tb_logger.close.remote()) + print(f"[INFO TUN-0035] TensorBoard events written to {tb_log_dir}") print("[INFO TUN-0010] Sweep complete.") diff --git a/tools/AutoTuner/src/autotuner/tensorboard_logger.py b/tools/AutoTuner/src/autotuner/tensorboard_logger.py new file mode 100644 index 0000000000..6e0dbf9200 --- /dev/null +++ b/tools/AutoTuner/src/autotuner/tensorboard_logger.py @@ -0,0 +1,67 @@ +import logging +import os +from typing import Any, Union + +import ray +from tensorboardX import SummaryWriter + +from autotuner.utils import ERROR_METRIC + +logger = logging.getLogger(__name__) + + +@ray.remote +class TensorBoardLogger: + """TensorBoard logger for AutoTuner experiments""" + + def __init__(self, log_dir: str): + os.makedirs(log_dir, exist_ok=True) + self.writer = SummaryWriter(log_dir=log_dir) + self.log_dir = log_dir + self.step = 0 + logger.info(f"TensorBoard logs will be written to {log_dir}") + + def log_sweep_metrics( + self, + params: dict[str, Any], + metrics: dict[str, Any], + score: float, + effective_clk_period: Union[float, str], + num_drc: Union[int, str], + die_area: Union[float, str], + ) -> None: + """Log metrics from a single sweep run""" + self.writer.add_scalar("sweep/score", score, self.step) + + if isinstance(effective_clk_period, (int, float)): + self.writer.add_scalar( + "sweep/effective_clk_period", effective_clk_period, self.step + ) + + if isinstance(num_drc, (int, float)): + self.writer.add_scalar("sweep/num_drc", num_drc, self.step) + + if isinstance(die_area, (int, float)): + self.writer.add_scalar("sweep/die_area", die_area, self.step) + + for key, value in metrics.items(): + if isinstance(value, (int, float)): + self.writer.add_scalar(f"metrics/{key}", value, self.step) + + self.writer.add_hparams( + { + k: v if isinstance(v, (int, float, str, bool)) else str(v) + for k, v in params.items() + }, + {"hparam/metric": score}, + ) + + self.step += 1 + + def close(self) -> None: + """Close the TensorBoard writer and log completion message""" + self.writer.close() + logger.info( + f"Sweep complete. View results with: tensorboard --logdir={self.log_dir}" + ) + logger.info(f"Total runs logged: {self.step}") diff --git a/tools/AutoTuner/src/autotuner/utils.py b/tools/AutoTuner/src/autotuner/utils.py index fadab40325..1aad0a489c 100644 --- a/tools/AutoTuner/src/autotuner/utils.py +++ b/tools/AutoTuner/src/autotuner/utils.py @@ -69,6 +69,24 @@ # Name of the TCL script run before routing FASTROUTE_TCL = "fastroute.tcl" DATE = datetime.now().strftime("%Y-%m-%d-%H-%M-%S") +# The worst of optimized metric +ERROR_METRIC = 9e99 + + +def calculate_score(metrics, step=1): + """Calculate optimization score from metrics.""" + error = "ERR" in metrics.values() + not_found = "N/A" in metrics.values() + + if error or not_found: + return (ERROR_METRIC, "-", "-", "-") + + effective_clk_period = metrics["clk_period"] - metrics["worst_slack"] + num_drc = metrics["num_drc"] + gamma = effective_clk_period / 10 + score = effective_clk_period * (100 / step) + gamma * num_drc + + return (score, effective_clk_period, num_drc, metrics["die_area"]) def write_sdc(variables, path, sdc_original, constraints_sdc): @@ -253,10 +271,10 @@ def parse_config( print(f"[ERROR TUN-0017] Variable {key} is not tunable.") sys.exit(1) options += f" {key}={value}" - if sdc: + if sdc or sdc_original: write_sdc(sdc, path, sdc_original, constraints_sdc) options += f" SDC_FILE={path}/{constraints_sdc}" - if fast_route: + if fast_route or fr_original: write_fast_route(fast_route, path, platform, fr_original, fastroute_tcl) options += f" FASTROUTE_TCL={path}/{fastroute_tcl}" return options @@ -287,6 +305,21 @@ def run_command( raise RuntimeError +def calculate_trial_path(args, base_dir, flow_variant): + """ + Calculate the log path and flow variant + """ + flow_variant_with_experiment = f"{args.experiment}/{flow_variant}" + log_path = os.path.abspath( + os.path.join( + base_dir, + f"flow/logs/{args.platform}/{args.design}", + flow_variant_with_experiment, + ) + ) + return log_path, flow_variant_with_experiment + + def openroad( args, base_dir, @@ -297,10 +330,8 @@ def openroad( """ Run OpenROAD-flow-scripts with a given set of parameters. """ - # Make sure path ends in a slash, i.e., is a folder - flow_variant = f"{args.experiment}/{flow_variant}" - log_path = os.path.abspath( - os.path.join(base_dir, f"flow/logs/{args.platform}/{args.design}", flow_variant) + log_path, flow_variant = calculate_trial_path( + args=args, base_dir=base_dir, flow_variant=flow_variant ) report_path = os.path.abspath( os.path.join( @@ -442,6 +473,8 @@ def read(path): return ret def read_sweep(this): + if this.get("type") == "string": + return {"type": "string", "values": this["values"]} return [*this["minmax"], this["step"]] def apply_condition(config, data): @@ -643,6 +676,20 @@ def openroad_distributed( variant=None, ): """Simple wrapper to run openroad distributed with Ray.""" + if variant is None: + variant_parts = [] + for key, value in config.items(): + if key not in ["_SDC_FILE_PATH", "_FR_FILE_PATH"]: + variant_parts.append(f"{key}_{value}") + variant = "_".join(variant_parts) if variant_parts else "" + flow_variant = f"{uuid.uuid4()}-{variant}" if variant else f"{uuid.uuid4()}" + + trial_path, _ = calculate_trial_path( + args=args, base_dir=repo_dir, flow_variant=flow_variant + ) + + os.makedirs(trial_path, exist_ok=True) + config = parse_config( config=config, base_dir=repo_dir, @@ -651,15 +698,15 @@ def openroad_distributed( constraints_sdc=CONSTRAINTS_SDC, fr_original=fr_original, fastroute_tcl=FASTROUTE_TCL, + path=trial_path, ) - if variant is None: - variant = config.replace(" ", "_").replace("=", "_") + t = time.time() metric_file = openroad( args=args, base_dir=repo_dir, parameters=config, - flow_variant=f"{uuid.uuid4()}-{variant}" if variant else f"{uuid.uuid4()}", + flow_variant=flow_variant, install_path=install_path, ) duration = time.time() - t @@ -669,9 +716,29 @@ def openroad_distributed( @ray.remote def consumer(queue): """consumer""" - while not queue.empty(): - next_item = queue.get() - name = next_item[1] - print(f"[INFO TUN-0007] Scheduling run for parameter {name}.") - ray.get(openroad_distributed.remote(*next_item)) - print(f"[INFO TUN-0008] Finished run for parameter {name}.") + item = queue.get() + tb_logger = item[6] + + while item: + args, repo_dir, config, sdc, fr, install, tb_logger = item + print(f"[INFO TUN-0007] Scheduling run for parameter {config}.") + metric_file, _ = ray.get( + openroad_distributed.remote(args, repo_dir, config, sdc, fr, install) + ) + print(f"[INFO TUN-0008] Finished run for parameter {config}.") + + metrics = read_metrics(metric_file, args.stop_stage) + score, effective_clk_period, num_drc, die_area = calculate_score(metrics) + + ray.get( + tb_logger.log_sweep_metrics.remote( + params=config, + metrics=metrics, + score=score, + effective_clk_period=effective_clk_period, + num_drc=num_drc, + die_area=die_area, + ) + ) + + item = queue.get() if not queue.empty() else None diff --git a/tools/OpenROAD b/tools/OpenROAD index f2403abf9f..919abce98a 160000 --- a/tools/OpenROAD +++ b/tools/OpenROAD @@ -1 +1 @@ -Subproject commit f2403abf9f3076c50104f0f17ccf4f6e2f79acff +Subproject commit 919abce98aa814d073fbe59131ab78b520cdb3a6 diff --git a/tools/kepler-formal b/tools/kepler-formal new file mode 160000 index 0000000000..2c0f78e748 --- /dev/null +++ b/tools/kepler-formal @@ -0,0 +1 @@ +Subproject commit 2c0f78e7483333dd0d5340cbb3567f96dd290d53 diff --git a/tools/yosys b/tools/yosys index 75eff54b31..9ed031ddd5 160000 --- a/tools/yosys +++ b/tools/yosys @@ -1 +1 @@ -Subproject commit 75eff54b316911f8a9aba6c8cb5c6637b76f2956 +Subproject commit 9ed031ddd588442f22be13ce608547a5809b62f0 diff --git a/tools/yosys-slang b/tools/yosys-slang index ccc13eabc3..64b44616a3 160000 --- a/tools/yosys-slang +++ b/tools/yosys-slang @@ -1 +1 @@ -Subproject commit ccc13eabc333a59d3a78bdb1d4a002928050e92d +Subproject commit 64b44616a3798f07453b14ea03e4ac8a16b77313