Skip to content
Snippets Groups Projects
variables_documentation.py 4.38 KiB
Newer Older
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright 2023 Efabless Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import subprocess

documented_elsewhere = """
CREATE_REPRODUCIBLE_FROM_SCRIPT
"""
internal_variables = """
CONFIGS
CORE_HEIGHT
CORE_WIDTH
CURRENT_DEF
CURRENT_GDS
CURRENT_GUIDE
CURRENT_INDEX
CURRENT_LIB
CURRENT_NETLIST
CURRENT_ODB
CURRENT_POWERED_NETLIST
CURRENT_SDC
CURRENT_SDF
CURRENT_SPEF
CURRENT_STEP
DEBUG
DESIGN_CONFIG
DESIGN_DIR
DEFAULT_SDC_FILE
ESTIMATE_PARASITICS
EXIT_ON_ERROR
EXT_NETLIST
FLOW_FAILED
GDS_INPUT
GLB_CFG_FILE
GND_NET
GRT_CONGESTION_REPORT_FILE
INSERT_BUFFER_COMMAND
INSERT_BUFFER_COUNTER
IO_READ_DEF
LAST_TIMING_REPORT_TAG
LEC_LHS_NETLIST
LEC_RHS_NETLIST
LOGS_DIR
MAGIC_GDS
MAGIC_SCRIPT
MAX_METAL_LAYER
MC_SDF_DIR
MC_SPEF_DIR
METAL_LAYER_NAMES
OPENLANE_MOUNTED_SCRIPTS_VERSION
OPENLANE_ROOT
OPENLANE_VERSION
OPENROAD_BIN
PACKAGED_SCRIPT_0
PDKPATH
PROCESS_CORNER
PWD
RCX_DEF
RCX_LEF
RCX_LIB
RCX_RULESET
REPORTS_DIR
REPORT_OUTPUT
RESULTS_DIR
RUN_DIR
RUN_TAG
SAVE_DEF
SAVE_GDS
SAVE_GUIDE
SAVE_LIB
SAVE_MAG
SAVE_NETLIST
SAVE_ODB
SAVE_POWERED_NETLIST
SAVE_SDC
SAVE_SDF
SAVE_SPEF
SCRIPTS_DIR
SCRIPT_DIR
START_TIME
STA_MULTICORNER
STA_PRE_CTS
SYNTH_EXPLORE
SYNTH_SCRIPT
TECH
TERM
TERMINAL_OUTPUT
TMP_DIR
TRACKS_INFO_FILE_PROCESSED
VCHECK_OUTPUT
VDD_NET
WRITE_VIEWS_NO_GLOBAL_CONNECT
TECH_METAL_LAYERS
LIB_SYNTH_COMPLETE
LIB_SYNTH_COMPLETE_NO_PG
LIB_SYNTH_MERGED
LIB_SYNTH_NO_PG
_PROPAGATE_ALL_CLOCKS
"""
gpio_variables = """
USE_GPIO_ROUTING_LEF
GPIO_PADS_LEF_CORE_SIDE
GPIO_PADS_VERILOG
"""
to_be_removed = """
ANTENNA_CHECK_CURRENT_DEF
CTS_CURRENT_DEF
DRC_CURRENT_DEF
LVS_CURRENT_DEF
PARSITICS_CURRENT_DEF
PLACEMENT_CURRENT_DEF
ROUTING_CURRENT_DEF
FAKEDIODE_CELL
VERILOG_STA_NETLISTS
"""
unexposed = """
HEURISTIC_ANTENNA_INSERTION_MODE
STA_MULTICORNER_READ_LIBS
"""
opts = """
CELLS_LEF_OPT
DRC_EXCLUDE_CELL_LIST_OPT
GDS_FILES_OPT
NO_SYNTH_CELL_LIST_OPT
STD_CELL_LIBRARY_OPT_CDL
TECH_LEF_OPT
LIB_SYNTH_OPT
"""
untested = """
LVS_EXTRA_GATE_LEVEL_VERILOG
LVS_EXTRA_STD_CELL_LIBRARY
KLAYOUT_DRC_TECH_SCRIPT
"""

white_list = set(
    (
        internal_variables
        + gpio_variables
        + to_be_removed
        + documented_elsewhere
        + unexposed
        + opts
        + untested
    ).split()
)
docs_variables = (
    subprocess.check_output(
        [
            "rg",
            r"^\s*\|\s*`([A-Z_]+)`",
            "-r",
            "$1",
            "-o",
            "-N",
            "-I",
            "--no-ignore",
            "docs/source/reference/configuration.md",
            "docs/source/reference/pdk_configuration.md",
        ]
    )
    .decode("utf-8")
    .split()
)
docs_variables = [var for var in docs_variables if var.isupper()]
docs_variables_set = set(docs_variables)

used_variables = (
    subprocess.check_output(
        [
            "rg",
            r"\$::env\(\s*([A-Z_]+?)\s*\)",
            "-r",
            "$1",
            "-o",
            "-N",
            "-I",
            "--no-ignore",
            "scripts",
            "flow.tcl",
        ]
    )
    .decode("utf-8")
    .split()
)
used_variables_set = set(used_variables)
translated_deprecated_variables = (
    subprocess.check_output(
        [
            "rg",
            r"handle_deprecated_config\s+([A-Z_]+)",
            "-r",
            "$1",
            "-o",
            "-N",
            "-I",
            "--no-ignore",
            "scripts",
            "flow.tcl",
        ]
    )
    .decode("utf-8")
    .split()
)
translated_deprecated_variables_set = set(translated_deprecated_variables)
undocumented = sorted(used_variables_set - docs_variables_set - white_list)
if undocumented:
    print("[ERROR]: found the following undocumented variables.")
    for var in undocumented:
        print(var)
    exit(1)
else:
    print("Pass")

# unused = sorted(
#     docs_variables_set - used_variables_set - translated_deprecated_variables_set
# )
# print(unused)