diff --git a/Taskfile.yml b/Taskfile.yml
index b3457d4..40608c3 100644
--- a/Taskfile.yml
+++ b/Taskfile.yml
@@ -30,20 +30,12 @@ vars:
gf180mcuD) echo "gf180mcu" ;;
*) echo ""; echo "Unknown PDK: {{.PDK}}" >&2; exit 1 ;;
esac
- PDK_ORFS:
- sh: |
- case "{{.PDK}}" in
- ihp-sg13g2) echo "ihp-sg13g2" ;;
- sky130A) echo "sky130hd" ;;
- gf180mcuD) echo "gf180" ;;
- *) echo ""; echo "Unknown PDK: {{.PDK}}" >&2; exit 1 ;;
- esac
PDK_HASH:
sh: |
case "{{.PDK}}" in
- ihp-sg13g2) echo "5cccb161f7492697cfa52eb14dc03beb00bdca9e" ;;
- sky130A) echo "7b70722e33c03fcb5dabcf4d479fb0822d9251c9" ;;
- gf180mcuD) echo "7b70722e33c03fcb5dabcf4d479fb0822d9251c9" ;;
+ ihp-sg13g2) echo "ee974c3adc69d0f36adbf20577079f0df419d702" ;;
+ sky130A) echo "f6eeac7dad085ffcc829ccfd721f7b4ce39edcf7" ;;
+ gf180mcuD) echo "f6eeac7dad085ffcc829ccfd721f7b4ce39edcf7" ;;
*) echo ""; echo "Unknown PDK: {{.PDK}}" >&2; exit 1 ;;
esac
@@ -107,96 +99,23 @@ tasks:
- "{{.RUN}} 'IP_ROOT={{.PWD}}/sources/{{.ip}}/ sbt \"runMain digital.peripherals.io.gpio.GpioExport\"'"
build:
- desc: Runs ORFS physical implementation for the given ip/macro/PDK.
- vars:
- ORFS_ENV: source {{.OPENROAD_FLOW_ROOT}}/../env.sh
- ORFS: >-
- make -C {{.OPENROAD_FLOW_ROOT}}
- YOSYS_EXE=$YOSYS_EXE
- OPENROAD_EXE=$OPENROAD_EXE
- IP_ROOT={{.PWD}}/sources/{{.ip}}/
- DESIGN_CONFIG={{.PWD}}/sources/{{.ip}}/{{.PDK}}/flow/orfs/{{.macro}}/config.mk
- WORK_HOME={{.BUILD_ROOT}}/{{.ip}}/{{.macro}}/orfs
- CDL: "{{.BUILD_ROOT}}/{{.ip}}/{{.macro}}/orfs/results/{{.PDK_ORFS}}/{{.macro}}/base/6_final.cdl"
- cmds:
- - "{{.CONTAINER_CHECK}}"
- - "{{.PDK_CHECK}}"
- - task: lib-sbt-publishLocal
- vars:
- project: "modules/elements/vexiiriscv"
- - "{{.RUN}} '{{.ORFS_ENV}} && {{.ORFS}} {{if .stage}}{{.stage}}{{end}}'"
- - "{{.RUN}} '{{.ORFS_ENV}} && {{.ORFS}} generate_abstract'"
- - "{{.RUN}} '{{.ORFS_ENV}} && {{.ORFS}} {{.CDL}}'"
- - "{{.RUN}} '{{.ORFS_ENV}} && {{.ORFS}} metadata-generate'"
- - "{{.RUN}} '{{.ORFS_ENV}} && {{.ORFS}} metadata-check'"
-
- update-metadata:
- desc: Updates the OpenROAD metadata for the given ip/macro/PDK.
- vars:
- ORFS_ENV: source {{.OPENROAD_FLOW_ROOT}}/../env.sh
- ORFS: >-
- make -C {{.OPENROAD_FLOW_ROOT}}
- YOSYS_EXE=$YOSYS_EXE
- OPENROAD_EXE=$OPENROAD_EXE
- IP_ROOT={{.PWD}}/sources/{{.ip}}/
- DESIGN_CONFIG={{.PWD}}/sources/{{.ip}}/{{.PDK}}/flow/orfs/{{.macro}}/config.mk
- WORK_HOME={{.BUILD_ROOT}}/{{.ip}}/{{.macro}}/orfs
- CDL: "{{.BUILD_ROOT}}/{{.ip}}/{{.macro}}/orfs/objects/{{.PDK_ORFS}}/{{.macro}}/base/6_final_concat.cdl"
- cmds:
- - "{{.CONTAINER_CHECK}}"
- - "{{.RUN}} '{{.ORFS_ENV}} && {{.ORFS}} metadata-generate'"
- - "{{.RUN}} '{{.ORFS_ENV}} && {{.ORFS}} update_rules'"
-
- build-librelane:
desc: Runs LibreLane physical implementation for the given ip/macro/PDK.
vars:
LIBRELANE_CMD: >-
- PYTHONPATH={{.PWD}}/tools/librelane python3 -m librelane
- --force-run-dir {{.BUILD_ROOT}}/{{.ip}}/{{.macro}}/librelane
+ PYTHONPATH={{.PWD}}/tools/librelane:{{.PWD}}/tools/librelane-plugins python3 -m librelane
+ --pdk {{.PDK}} --pdk-root {{.PDK_ROOT}}
+ --force-run-dir {{.BUILD_ROOT}}/{{.ip}}/{{.macro}}/librelane/{{.PDK}}
{{.PWD}}/sources/{{.ip}}/{{.PDK}}/flow/librelane/{{.macro}}.yml
cmds:
- "{{.CONTAINER_CHECK}}"
- "{{.PDK_CHECK}}"
- - "mkdir -p {{.BUILD_ROOT}}/{{.ip}}/{{.macro}}/librelane"
+ - task: lib-sbt-publishLocal
+ vars:
+ project: "modules/elements/vexiiriscv"
+ - "rm -rf {{.BUILD_ROOT}}/{{.ip}}/{{.macro}}/librelane/{{.PDK}}"
+ - "mkdir -p {{.BUILD_ROOT}}/{{.ip}}/{{.macro}}/librelane/{{.PDK}}"
- "{{.RUN}} '{{.LIBRELANE_CMD}}'"
- check-logs:
- desc: Scans ORFS build logs for warnings and errors for the given ip/macro/PDK.
- cmds:
- - "{{.CONTAINER_CHECK}}"
- - "{{.RUN}} 'find {{.BUILD_ROOT}}/{{.ip}}/{{.macro}}/orfs/logs/{{.PDK_ORFS}}/{{.macro}}/ -type f -iname \"*.log\" -exec grep -v -e \"already destroyed\" -e \"XDG_RUNTIME_DIR not set\" -i {} \\+ |
- grep --color -e WARNING -e ERROR'"
- - "{{.RUN}} 'find {{.BUILD_ROOT}}/{{.ip}}/{{.macro}}/orfs/reports/{{.PDK_ORFS}}/{{.macro}}/ -type f -iname \"6_finish.rpt\" -exec grep \"violation count\" {} \\+'"
-
- run-drc:
- desc: Runs KLayout DRC sign-off for the given ip/macro/PDK.
- vars:
- DRC_CMD: >-
- bash {{.PWD}}/scripts/run_drc.sh
- --gds {{.BUILD_ROOT}}/{{.ip}}/{{.macro}}/orfs/results/{{.PDK_ORFS}}/{{.macro}}/base/6_final.gds
- --topcell {{.macro}}
- --run-dir {{.BUILD_ROOT}}/{{.ip}}/{{.macro}}/verification/{{.PDK}}/drc/
- --jobs {{numCPU}}
- cmds:
- - "{{.CONTAINER_CHECK}}"
- - "{{.RUN}} '{{.DRC_CMD}}'"
-
- run-lvs:
- desc: Runs KLayout LVS sign-off for the given ip/macro/PDK.
- vars:
- ORFS_RESULTS: "{{.BUILD_ROOT}}/{{.ip}}/{{.macro}}/orfs/results/{{.PDK_ORFS}}/{{.macro}}/base"
- ORFS_OBJECTS: "{{.BUILD_ROOT}}/{{.ip}}/{{.macro}}/orfs/objects/{{.PDK_ORFS}}/{{.macro}}/base"
- LVS_CMD: >-
- bash {{.PWD}}/scripts/run_lvs.sh
- --gds {{.ORFS_RESULTS}}/6_final.gds
- --topcell {{.macro}}
- --netlist {{.ORFS_RESULTS}}/6_final.cdl
- --netlist-concat {{.ORFS_OBJECTS}}/6_final_concat.cdl
- --run-dir {{.BUILD_ROOT}}/{{.ip}}/{{.macro}}/verification/{{.PDK}}/lvs/
- cmds:
- - "{{.CONTAINER_CHECK}}"
- - "{{.RUN}} '{{.LVS_CMD}}'"
-
run-test:
desc: Runs cocotb simulation tests for the given ip/macro/PDK.
vars:
@@ -215,46 +134,28 @@ tasks:
cmds:
- "venv/bin/reuse --root {{.PWD}}/sources/{{.ip}}/ lint"
- view-drc:
- desc: Opens DRC results in KLayout for the given ip/macro/PDK.
- vars:
- GDS: "{{.BUILD_ROOT}}/{{.ip}}/{{.macro}}/orfs/results/{{.PDK_ORFS}}/{{.macro}}/base/6_final.gds"
- DRC_DB: "{{.BUILD_ROOT}}/{{.ip}}/{{.macro}}/verification/{{.PDK}}/drc/{{.macro}}_drc.lyrdb"
- cmds:
- - "{{.CONTAINER_CHECK}}"
- - "{{.RUN}} 'klayout -n {{.TECH}} -e {{.GDS}} -m {{.DRC_DB}}'"
-
- view-lvs:
- desc: Opens LVS results in KLayout for the given ip/macro/PDK.
- vars:
- GDS: "{{.BUILD_ROOT}}/{{.ip}}/{{.macro}}/orfs/results/{{.PDK_ORFS}}/{{.macro}}/base/6_final.gds"
- LVS_DB: "{{.BUILD_ROOT}}/{{.ip}}/{{.macro}}/verification/{{.PDK}}/lvs/6_final.lvsdb"
- cmds:
- - "{{.CONTAINER_CHECK}}"
- - "{{.RUN}} 'klayout -n {{.TECH}} -e {{.GDS}} -mn {{.LVS_DB}}'"
-
- view-openroad:
+ openroad:
desc: Opens the final ODB in the OpenROAD GUI for the given ip/macro/PDK.
vars:
- ODB: "{{.BUILD_ROOT}}/{{.ip}}/{{.macro}}/orfs/results/{{.PDK_ORFS}}/{{.macro}}/base/{{if .stage}}{{.stage}}{{else}}6_final{{end}}.odb"
+ ODB: "{{.BUILD_ROOT}}/{{.ip}}/{{.macro}}/librelane/{{.PDK}}/final/odb/{{.macro}}.odb"
cmds:
- "{{.CONTAINER_CHECK}}"
- "{{.RUN}} '{{.OPENROAD_EXE}} -gui <(echo read_db {{.ODB}})'"
- view-klayout:
- desc: Opens the final GDS in KLayout for the given ip/macro/PDK.
+ klayout:
+ desc: |
+ Opens the final GDS in KLayout for the given ip/macro/PDK.
+ Use mode=drc to also load the KLayout DRC marker database.
vars:
- GDS: "{{.BUILD_ROOT}}/{{.ip}}/{{.macro}}/orfs/results/{{.PDK_ORFS}}/{{.macro}}/base/6_final.gds"
+ GDS: "{{.BUILD_ROOT}}/{{.ip}}/{{.macro}}/librelane/{{.PDK}}/final/gds/{{.macro}}.gds"
+ DRC_DB: "{{.BUILD_ROOT}}/{{.ip}}/{{.macro}}/librelane/{{.PDK}}/65-klayout-drc/reports/drc.klayout.lyrdb"
+ DRC_FLAG: '{{if eq .mode "drc"}}-m {{.DRC_DB}}{{end}}'
cmds:
- "{{.CONTAINER_CHECK}}"
- - "{{.RUN}} 'klayout -n {{.TECH}} -e {{.GDS}}'"
+ - "{{.RUN}} 'klayout -n {{.TECH}} -e {{.GDS}} {{.DRC_FLAG}}'"
default:
cmds:
- task: build
- - task: run-drc
- # LVS is not stable yet. Skip for now.
- #- task: run-lvs
- task: run-test
- - task: check-logs
- task: check-license
diff --git a/ipfab/README.rst b/ipfab/README.rst
index b521a63..3e07e5a 100644
--- a/ipfab/README.rst
+++ b/ipfab/README.rst
@@ -123,13 +123,11 @@ archive and publish once all macros are ready.
::
- # 1. Build the IP with ORFS (produces build/ artefacts)
+ # 1. Build the IP with LibreLane (produces build/ artefacts)
task ip=digital/peripherals/io/gpio macro=gpio_apb_32b PDK=ihp-sg13g2 build
- # 2. Run sign-off (DRC/LVS/simulation)
- task ip=digital/peripherals/io/gpio macro=gpio_apb_32b PDK=ihp-sg13g2 run-drc
+ # 2. Run some checks
task ip=digital/peripherals/io/gpio macro=gpio_apb_32b PDK=ihp-sg13g2 run-test
- task ip=digital/peripherals/io/gpio macro=gpio_apb_32b PDK=ihp-sg13g2 check-logs
task ip=digital/peripherals/io/gpio macro=gpio_apb_32b PDK=ihp-sg13g2 check-license
# 3. Package each macro
diff --git a/ipfab/ipfab/ipfab.py b/ipfab/ipfab/ipfab.py
index 591f6a5..357ec25 100644
--- a/ipfab/ipfab/ipfab.py
+++ b/ipfab/ipfab/ipfab.py
@@ -22,17 +22,10 @@
IPXACT_NS = "http://www.accellera.org/XMLSchema/IPXACT/1685-2014"
XSI_NS = "http://www.w3.org/2001/XMLSchema-instance"
-# Map canonical PDK names to their ORFS platform directory names.
-_ORFS_PDK_MAP = {
- "ihp-sg13g2": "ihp-sg13g2",
- "sky130A": "sky130hd",
- "gf180mcuD": "gf180",
-}
-
-# Map canonical corner names to PDK-specific ORFS output suffixes.
-# PDKs not listed here use the defaults (slow/typ/fast).
_CORNER_MAP = {
- "gf180mcuD": {"slow": "WC", "typ": "TT", "fast": "BC"},
+ "gf180mcuD": {"slow": "ss_125C_4v50", "typ": "tt_025C_5v00", "fast": "ff_n40C_5v50"},
+ "sky130A": {"slow": "ss_100C_1v60", "typ": "tt_025C_1v80", "fast": "ff_n40C_1v95"},
+ "ihp-sg13g2": {"slow": "slow_1p08V_125C", "typ": "typ_1p20V_25C", "fast": "fast_1p32V_m40C"},
}
@@ -66,7 +59,7 @@ def _corners(pdk: str) -> dict:
def func_package(args):
- """Assemble a package directory from sources and ORFS build artefacts."""
+ """Assemble a package directory from sources and LibreLane build artefacts."""
_check_clean_repo(args.allow_dirty)
git = _git_info()
@@ -89,7 +82,7 @@ def func_package(args):
print(f"Copying source files from {src_dir}")
shutil.copytree(src_dir, pkg_dir, dirs_exist_ok=True,
- ignore=shutil.ignore_patterns("__pycache__", args.pdk))
+ ignore=shutil.ignore_patterns("__pycache__", args.pdk, *_CORNER_MAP))
pdk_src_dir = src_dir / args.pdk
if pdk_src_dir.is_dir():
@@ -109,43 +102,46 @@ def _package_macro(pkg_dir, args, macro):
for dir_ in ("gds", "lef", "netlist", "lib", f"reports/{macro}", f"signoff/{macro}"):
(pkg_dir / dir_).mkdir(parents=True, exist_ok=True)
- orfs_pdk = args.orfs_pdk or _ORFS_PDK_MAP.get(args.pdk, args.pdk)
- report_dir = build_dir / f"orfs/reports/{orfs_pdk}/{macro}/base/"
- result_dir = build_dir / f"orfs/results/{orfs_pdk}/{macro}/base/"
- object_dir = build_dir / f"orfs/objects/{orfs_pdk}/{macro}/base/"
- print(f"Copying build artifacts for {macro} from {result_dir}")
- shutil.copy(result_dir / "6_final.gds", pkg_dir / f"gds/{macro}.gds")
- shutil.copy(result_dir / f"{macro}.lef", pkg_dir / f"lef/{macro}.lef")
- shutil.copy(result_dir / "6_final.v", pkg_dir / f"netlist/{macro}.v")
- shutil.copy(result_dir / "6_final.sdc", pkg_dir / f"netlist/{macro}.sdc")
- shutil.copy(result_dir / "6_final.spef", pkg_dir / f"netlist/{macro}.spef")
- shutil.copy(result_dir / "6_final.cdl", pkg_dir / f"netlist/{macro}.cdl")
+ final_dir = build_dir / "librelane" / args.pdk / "final"
+ if not final_dir.is_dir():
+ raise FileNotFoundError(f"LibreLane final directory not found: {final_dir}")
+ print(f"Copying build artifacts for {macro} from {final_dir}")
+ shutil.copy(final_dir / f"gds/{macro}.gds", pkg_dir / f"gds/{macro}.gds")
+ shutil.copy(final_dir / f"lef/{macro}.lef", pkg_dir / f"lef/{macro}.lef")
+ shutil.copy(final_dir / f"nl/{macro}.nl.v", pkg_dir / f"netlist/{macro}.v")
+ shutil.copy(final_dir / f"sdc/{macro}.sdc", pkg_dir / f"netlist/{macro}.sdc")
+ shutil.copy(final_dir / f"spef/nom/{macro}.nom.spef", pkg_dir / f"netlist/{macro}.spef")
+ shutil.copy(final_dir / f"spice/{macro}.spice", pkg_dir / f"netlist/{macro}.cdl")
c = _corners(args.pdk)
- shutil.copy(result_dir / f"{macro}_{c['slow']}.lib", pkg_dir / f"lib/{macro}_slow.lib")
- shutil.copy(result_dir / f"{macro}_{c['typ']}.lib", pkg_dir / f"lib/{macro}_typ.lib")
- shutil.copy(result_dir / f"{macro}_{c['fast']}.lib", pkg_dir / f"lib/{macro}_fast.lib")
-
- shutil.copy(report_dir / "6_finish.rpt", pkg_dir / "reports" / macro)
- for f in report_dir.rglob("*.webp"):
- shutil.copy(f, pkg_dir / "reports" / macro)
-
- verification_dir = build_dir / f"verification/{args.pdk}"
- for check in ("drc", "lvs", "test"):
- check_src = verification_dir / check
- check_dst = pkg_dir / "signoff" / macro / check
- if not check_src.is_dir():
- continue
- check_dst.mkdir(parents=True, exist_ok=True)
- if check == "drc":
- for f in check_src.glob("*.lyrdb"):
- shutil.copy(f, check_dst)
- elif check == "lvs":
- for f in check_src.glob("*.lvsdb"):
- shutil.copy(f, check_dst)
- elif check == "test":
- results = check_src / "results.xml"
- if results.exists():
- shutil.copy(results, check_dst)
+ for name in ("slow", "typ", "fast"):
+ corner = f"nom_{c[name]}"
+ shutil.copy(final_dir / f"lib/{corner}/{macro}__{corner}.lib",
+ pkg_dir / f"lib/{macro}_{name}.lib")
+
+ metrics = final_dir / "metrics.json"
+ if metrics.exists():
+ shutil.copy(metrics, pkg_dir / "reports" / macro)
+ render = final_dir / f"render/{macro}.png"
+ if render.exists():
+ shutil.copy(render, pkg_dir / "reports" / macro)
+
+ librelane_dir = build_dir / "librelane" / args.pdk
+ signoff_dir = pkg_dir / "signoff" / macro
+
+ drc = sorted(librelane_dir.glob("*-klayout-drc/reports/drc.klayout.lyrdb"))
+ if drc:
+ (signoff_dir / "drc").mkdir(parents=True, exist_ok=True)
+ shutil.copy(drc[-1], signoff_dir / "drc")
+
+ lvs = sorted(librelane_dir.glob("*-netgen-lvs/reports/lvs.netgen.rpt"))
+ if lvs:
+ (signoff_dir / "lvs").mkdir(parents=True, exist_ok=True)
+ shutil.copy(lvs[-1], signoff_dir / "lvs")
+
+ test_results = build_dir / f"verification/{args.pdk}/test/results.xml"
+ if test_results.exists():
+ (signoff_dir / "test").mkdir(parents=True, exist_ok=True)
+ shutil.copy(test_results, signoff_dir / "test")
def _update_manifest(pkg_dir: Path, macro: str, pdk: str,
@@ -475,10 +471,6 @@ def arguments():
parser_package = subparsers.add_parser("package", parents=[common], help="Package a macro")
parser_package.add_argument("--macro", type=str, required=True)
- parser_package.add_argument(
- "--orfs-pdk", type=str, default=None,
- help="ORFS PDK name if different from --pdk (e.g. gf180mcuD uses orfs-pdk gf180)",
- )
parser_package.add_argument(
"--allow-dirty", action="store_true",
help="Allow packaging from a repository with uncommitted changes",
diff --git a/manifest.xml b/manifest.xml
index 78a8c39..0156c22 100644
--- a/manifest.xml
+++ b/manifest.xml
@@ -11,10 +11,12 @@ SPDX-License-Identifier: CERN-OHL-W-2.0
-
-
+
+
+
+
diff --git a/podman-compose.yml b/podman-compose.yml
index 2496ae6..0b179e3 100644
--- a/podman-compose.yml
+++ b/podman-compose.yml
@@ -10,7 +10,7 @@ volumes:
cache:
services:
elements:
- image: docker.io/dnltz/elements:v2.3
+ image: docker.io/dnltz/elements:v2.6
container_name: ipforge_container
environment:
- DISPLAY=${DISPLAY}
diff --git a/sources/digital/peripherals/io/gpio/gf180mcuD/constraints/sdc/gpio_x_x.sdc b/sources/digital/peripherals/io/gpio/gf180mcuD/constraints/sdc/gpio_x_x.sdc
index 9c156f9..f983f67 100644
--- a/sources/digital/peripherals/io/gpio/gf180mcuD/constraints/sdc/gpio_x_x.sdc
+++ b/sources/digital/peripherals/io/gpio/gf180mcuD/constraints/sdc/gpio_x_x.sdc
@@ -2,7 +2,7 @@
#
# SPDX-License-Identifier: CERN-OHL-W-2.0
-create_clock [get_ports clk] -name clk -period 20.0 -waveform {0 10.0}
+create_clock [get_ports clk] -name clk -period 30.0 -waveform {0 15.0}
set_ideal_network [get_ports clk]
set_clock_uncertainty 0.15 [get_clocks clk]
set_clock_transition 0.25 [get_clocks clk]
diff --git a/sources/digital/peripherals/io/gpio/gf180mcuD/flow/librelane/gpio_apb_32b.yml b/sources/digital/peripherals/io/gpio/gf180mcuD/flow/librelane/gpio_apb_32b.yml
new file mode 100644
index 0000000..6fe657a
--- /dev/null
+++ b/sources/digital/peripherals/io/gpio/gf180mcuD/flow/librelane/gpio_apb_32b.yml
@@ -0,0 +1,47 @@
+# SPDX-FileCopyrightText: 2026 aesc silicon
+#
+# SPDX-License-Identifier: CERN-OHL-W-2.0
+
+meta:
+ version: 3
+ flow: Classic
+ substituting_steps:
+ "+OpenROAD.IOPlacement": "Aesc.FixedIOPlacement"
+
+DESIGN_NAME: gpio_apb_32b
+PDK: gf180mcuD
+VERILOG_FILES:
+ - dir::../../../rtl/verilog/gpio_apb_32b.v
+LINTER_DISABLE_WARNINGS: [TIMESCALEMOD]
+
+CLOCK_PORT: clk
+CLOCK_PERIOD: 30.00
+
+PNR_SDC_FILE: ref::$DESIGN_DIR/../../constraints/sdc/gpio_x_x.sdc
+SIGNOFF_SDC_FILE: ref::$DESIGN_DIR/../../constraints/sdc/gpio_x_x.sdc
+
+PDN_CFG: ref::$DESIGN_DIR/../../constraints/pdn/gpio_x_32b.tcl
+
+FIXED_IO_SCRIPT: ref::$DESIGN_DIR/../../constraints/io/gpio_apb_32b.tcl
+
+FP_SIZING: absolute
+DIE_AREA: [0.0, 0.0, 262.08, 426.16]
+CORE_AREA: [11.20, 11.76, 250.88, 414.96]
+PL_TARGET_DENSITY_PCT: 80
+RT_MAX_LAYER: Metal4
+
+PL_RESIZER_HOLD_SLACK_MARGIN: 0.05
+
+DESIGN_REPAIR_MAX_SLEW_PCT: 50
+DESIGN_REPAIR_MAX_CAP_PCT: 50
+
+VDD_NETS: [VDD]
+GND_NETS: [VSS]
+
+PRIMARY_GDSII_STREAMOUT_TOOL: klayout
+
+RUN_MAGIC_DRC: false
+RUN_GDSCHECK_DRC: true
+
+KLAYOUT_DRC_RUNSET: ref::$DESIGN_DIR/../../../../../../../../pdks/gf180mcuD/libs.tech/klayout/tech/drc/gf180mcu.drc
+ERROR_ON_KLAYOUT_DRC: false
diff --git a/sources/digital/peripherals/io/gpio/gf180mcuD/flow/librelane/gpio_tl_32b.yml b/sources/digital/peripherals/io/gpio/gf180mcuD/flow/librelane/gpio_tl_32b.yml
new file mode 100644
index 0000000..6fe657a
--- /dev/null
+++ b/sources/digital/peripherals/io/gpio/gf180mcuD/flow/librelane/gpio_tl_32b.yml
@@ -0,0 +1,47 @@
+# SPDX-FileCopyrightText: 2026 aesc silicon
+#
+# SPDX-License-Identifier: CERN-OHL-W-2.0
+
+meta:
+ version: 3
+ flow: Classic
+ substituting_steps:
+ "+OpenROAD.IOPlacement": "Aesc.FixedIOPlacement"
+
+DESIGN_NAME: gpio_apb_32b
+PDK: gf180mcuD
+VERILOG_FILES:
+ - dir::../../../rtl/verilog/gpio_apb_32b.v
+LINTER_DISABLE_WARNINGS: [TIMESCALEMOD]
+
+CLOCK_PORT: clk
+CLOCK_PERIOD: 30.00
+
+PNR_SDC_FILE: ref::$DESIGN_DIR/../../constraints/sdc/gpio_x_x.sdc
+SIGNOFF_SDC_FILE: ref::$DESIGN_DIR/../../constraints/sdc/gpio_x_x.sdc
+
+PDN_CFG: ref::$DESIGN_DIR/../../constraints/pdn/gpio_x_32b.tcl
+
+FIXED_IO_SCRIPT: ref::$DESIGN_DIR/../../constraints/io/gpio_apb_32b.tcl
+
+FP_SIZING: absolute
+DIE_AREA: [0.0, 0.0, 262.08, 426.16]
+CORE_AREA: [11.20, 11.76, 250.88, 414.96]
+PL_TARGET_DENSITY_PCT: 80
+RT_MAX_LAYER: Metal4
+
+PL_RESIZER_HOLD_SLACK_MARGIN: 0.05
+
+DESIGN_REPAIR_MAX_SLEW_PCT: 50
+DESIGN_REPAIR_MAX_CAP_PCT: 50
+
+VDD_NETS: [VDD]
+GND_NETS: [VSS]
+
+PRIMARY_GDSII_STREAMOUT_TOOL: klayout
+
+RUN_MAGIC_DRC: false
+RUN_GDSCHECK_DRC: true
+
+KLAYOUT_DRC_RUNSET: ref::$DESIGN_DIR/../../../../../../../../pdks/gf180mcuD/libs.tech/klayout/tech/drc/gf180mcu.drc
+ERROR_ON_KLAYOUT_DRC: false
diff --git a/sources/digital/peripherals/io/gpio/gf180mcuD/flow/librelane/gpio_wb_32b.yml b/sources/digital/peripherals/io/gpio/gf180mcuD/flow/librelane/gpio_wb_32b.yml
new file mode 100644
index 0000000..6fe657a
--- /dev/null
+++ b/sources/digital/peripherals/io/gpio/gf180mcuD/flow/librelane/gpio_wb_32b.yml
@@ -0,0 +1,47 @@
+# SPDX-FileCopyrightText: 2026 aesc silicon
+#
+# SPDX-License-Identifier: CERN-OHL-W-2.0
+
+meta:
+ version: 3
+ flow: Classic
+ substituting_steps:
+ "+OpenROAD.IOPlacement": "Aesc.FixedIOPlacement"
+
+DESIGN_NAME: gpio_apb_32b
+PDK: gf180mcuD
+VERILOG_FILES:
+ - dir::../../../rtl/verilog/gpio_apb_32b.v
+LINTER_DISABLE_WARNINGS: [TIMESCALEMOD]
+
+CLOCK_PORT: clk
+CLOCK_PERIOD: 30.00
+
+PNR_SDC_FILE: ref::$DESIGN_DIR/../../constraints/sdc/gpio_x_x.sdc
+SIGNOFF_SDC_FILE: ref::$DESIGN_DIR/../../constraints/sdc/gpio_x_x.sdc
+
+PDN_CFG: ref::$DESIGN_DIR/../../constraints/pdn/gpio_x_32b.tcl
+
+FIXED_IO_SCRIPT: ref::$DESIGN_DIR/../../constraints/io/gpio_apb_32b.tcl
+
+FP_SIZING: absolute
+DIE_AREA: [0.0, 0.0, 262.08, 426.16]
+CORE_AREA: [11.20, 11.76, 250.88, 414.96]
+PL_TARGET_DENSITY_PCT: 80
+RT_MAX_LAYER: Metal4
+
+PL_RESIZER_HOLD_SLACK_MARGIN: 0.05
+
+DESIGN_REPAIR_MAX_SLEW_PCT: 50
+DESIGN_REPAIR_MAX_CAP_PCT: 50
+
+VDD_NETS: [VDD]
+GND_NETS: [VSS]
+
+PRIMARY_GDSII_STREAMOUT_TOOL: klayout
+
+RUN_MAGIC_DRC: false
+RUN_GDSCHECK_DRC: true
+
+KLAYOUT_DRC_RUNSET: ref::$DESIGN_DIR/../../../../../../../../pdks/gf180mcuD/libs.tech/klayout/tech/drc/gf180mcu.drc
+ERROR_ON_KLAYOUT_DRC: false
diff --git a/sources/digital/peripherals/io/gpio/gf180mcuD/flow/orfs/gpio_apb_32b/config.mk b/sources/digital/peripherals/io/gpio/gf180mcuD/flow/orfs/gpio_apb_32b/config.mk
deleted file mode 100644
index 3371250..0000000
--- a/sources/digital/peripherals/io/gpio/gf180mcuD/flow/orfs/gpio_apb_32b/config.mk
+++ /dev/null
@@ -1,29 +0,0 @@
-# SPDX-FileCopyrightText: 2026 aesc silicon
-#
-# SPDX-License-Identifier: CERN-OHL-W-2.0
-
-export DESIGN_NAME=gpio_apb_32b
-export DESIGN_NICKNAME=gpio_apb_32b
-export PLATFORM=gf180
-export VERILOG_FILES=${IP_ROOT}/rtl/verilog/gpio_apb_32b.v
-export DIE_AREA = 0.0 0.0 262.08 426.16
-export CORE_AREA = 11.20 11.76 250.88 414.96
-export LEC_CHECK = 0
-export MAX_ROUTING_LAYER = Metal4
-export PLACE_DENSITY = 0.80
-export CORNERS = WC TT BC
-export SDC_FILE=${IP_ROOT}/${PDK}/constraints/sdc/gpio_x_x.sdc
-export PDN_TCL=${IP_ROOT}/${PDK}/constraints/pdn/gpio_x_32b.tcl
-export IO_CONSTRAINTS=${IP_ROOT}/${PDK}/constraints/io/gpio_apb_32b.tcl
-export CDL_FILE = $(PDK_ROOT)/${PDK}/libs.ref/gf180mcu_fd_sc_mcu7t5v0/cdl/gf180mcu_fd_sc_mcu7t5v0.cdl
-export TRACK_OPTION = 7t
-export TECH_LEF = $(PDK_ROOT)/${PDK}/libs.ref/gf180mcu_fd_sc_mcu7t5v0/techlef/gf180mcu_fd_sc_mcu7t5v0__nom.tlef
-export SC_LEF = $(PDK_ROOT)/${PDK}/libs.ref/gf180mcu_fd_sc_mcu7t5v0/lef/gf180mcu_fd_sc_mcu7t5v0.lef
-export BC_LIB_FILES = $(PDK_ROOT)/${PDK}/libs.ref/gf180mcu_fd_sc_mcu7t5v0/lib/gf180mcu_fd_sc_mcu7t5v0__ff_n40C_5v50.lib
-export WC_LIB_FILES = $(PDK_ROOT)/${PDK}/libs.ref/gf180mcu_fd_sc_mcu7t5v0/lib/gf180mcu_fd_sc_mcu7t5v0__ss_125C_4v50.lib
-export TT_LIB_FILES = $(PDK_ROOT)/${PDK}/libs.ref/gf180mcu_fd_sc_mcu7t5v0/lib/gf180mcu_fd_sc_mcu7t5v0__tt_025C_5v00.lib
-export TT_LIB_FILES += $(ADDITIONAL_LIBS)
-export WC_LIB_FILES += $(ADDITIONAL_SLOW_LIBS)
-export BC_LIB_FILES += $(ADDITIONAL_FAST_LIBS)
-export GDS_FILES = $(PDK_ROOT)/${PDK}/libs.ref/gf180mcu_fd_sc_mcu7t5v0/gds/gf180mcu_fd_sc_mcu7t5v0.gds
-export GDS_FILES += $(ADDITIONAL_GDS)
diff --git a/sources/digital/peripherals/io/gpio/gf180mcuD/flow/orfs/gpio_apb_32b/rules-base.json b/sources/digital/peripherals/io/gpio/gf180mcuD/flow/orfs/gpio_apb_32b/rules-base.json
deleted file mode 100644
index 7201bca..0000000
--- a/sources/digital/peripherals/io/gpio/gf180mcuD/flow/orfs/gpio_apb_32b/rules-base.json
+++ /dev/null
@@ -1,102 +0,0 @@
-{
- "synth__design__instance__area__stdcell": {
- "value": 77100.0,
- "compare": "<="
- },
- "constraints__clocks__count": {
- "value": 1,
- "compare": "=="
- },
- "placeopt__design__instance__area": {
- "value": 83808,
- "compare": "<="
- },
- "placeopt__design__instance__count__stdcell": {
- "value": 2339,
- "compare": "<="
- },
- "detailedplace__design__violations": {
- "value": 0,
- "compare": "=="
- },
- "cts__design__instance__count__setup_buffer": {
- "value": 203,
- "compare": "<="
- },
- "cts__design__instance__count__hold_buffer": {
- "value": 203,
- "compare": "<="
- },
- "cts__timing__setup__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "cts__timing__setup__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "cts__timing__hold__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "cts__timing__hold__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "globalroute__antenna_diodes_count": {
- "value": 100,
- "compare": "<="
- },
- "globalroute__timing__setup__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "globalroute__timing__setup__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "globalroute__timing__hold__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "globalroute__timing__hold__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "detailedroute__route__wirelength": {
- "value": 141913,
- "compare": "<="
- },
- "detailedroute__route__drc_errors": {
- "value": 0,
- "compare": "<="
- },
- "detailedroute__antenna__violating__nets": {
- "value": 0,
- "compare": "<="
- },
- "detailedroute__antenna_diodes_count": {
- "value": 100,
- "compare": "<="
- },
- "finish__timing__setup__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "finish__timing__setup__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "finish__timing__hold__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "finish__timing__hold__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "finish__design__instance__area": {
- "value": 87640,
- "compare": "<="
- }
-}
\ No newline at end of file
diff --git a/sources/digital/peripherals/io/gpio/gf180mcuD/flow/orfs/gpio_tl_32b/config.mk b/sources/digital/peripherals/io/gpio/gf180mcuD/flow/orfs/gpio_tl_32b/config.mk
deleted file mode 100644
index c4096b4..0000000
--- a/sources/digital/peripherals/io/gpio/gf180mcuD/flow/orfs/gpio_tl_32b/config.mk
+++ /dev/null
@@ -1,29 +0,0 @@
-# SPDX-FileCopyrightText: 2026 aesc silicon
-#
-# SPDX-License-Identifier: CERN-OHL-W-2.0
-
-export DESIGN_NAME=gpio_tl_32b
-export DESIGN_NICKNAME=gpio_tl_32b
-export PLATFORM=gf180
-export VERILOG_FILES=${IP_ROOT}/rtl/verilog/gpio_tl_32b.v
-export DIE_AREA = 0.0 0.0 277.20 426.16
-export CORE_AREA = 11.20 11.76 266.00 414.96
-export LEC_CHECK = 0
-export MAX_ROUTING_LAYER = Metal4
-export PLACE_DENSITY = 0.80
-export CORNERS = WC TT BC
-export SDC_FILE=${IP_ROOT}/${PDK}/constraints/sdc/gpio_x_x.sdc
-export PDN_TCL=${IP_ROOT}/${PDK}/constraints/pdn/gpio_x_32b.tcl
-export IO_CONSTRAINTS=${IP_ROOT}/${PDK}/constraints/io/gpio_tl_32b.tcl
-export CDL_FILE = $(PDK_ROOT)/${PDK}/libs.ref/gf180mcu_fd_sc_mcu7t5v0/cdl/gf180mcu_fd_sc_mcu7t5v0.cdl
-export TRACK_OPTION = 7t
-export TECH_LEF = $(PDK_ROOT)/${PDK}/libs.ref/gf180mcu_fd_sc_mcu7t5v0/techlef/gf180mcu_fd_sc_mcu7t5v0__nom.tlef
-export SC_LEF = $(PDK_ROOT)/${PDK}/libs.ref/gf180mcu_fd_sc_mcu7t5v0/lef/gf180mcu_fd_sc_mcu7t5v0.lef
-export BC_LIB_FILES = $(PDK_ROOT)/${PDK}/libs.ref/gf180mcu_fd_sc_mcu7t5v0/lib/gf180mcu_fd_sc_mcu7t5v0__ff_n40C_5v50.lib
-export WC_LIB_FILES = $(PDK_ROOT)/${PDK}/libs.ref/gf180mcu_fd_sc_mcu7t5v0/lib/gf180mcu_fd_sc_mcu7t5v0__ss_125C_4v50.lib
-export TT_LIB_FILES = $(PDK_ROOT)/${PDK}/libs.ref/gf180mcu_fd_sc_mcu7t5v0/lib/gf180mcu_fd_sc_mcu7t5v0__tt_025C_5v00.lib
-export TT_LIB_FILES += $(ADDITIONAL_LIBS)
-export WC_LIB_FILES += $(ADDITIONAL_SLOW_LIBS)
-export BC_LIB_FILES += $(ADDITIONAL_FAST_LIBS)
-export GDS_FILES = $(PDK_ROOT)/${PDK}/libs.ref/gf180mcu_fd_sc_mcu7t5v0/gds/gf180mcu_fd_sc_mcu7t5v0.gds
-export GDS_FILES += $(ADDITIONAL_GDS)
diff --git a/sources/digital/peripherals/io/gpio/gf180mcuD/flow/orfs/gpio_tl_32b/rules-base.json b/sources/digital/peripherals/io/gpio/gf180mcuD/flow/orfs/gpio_tl_32b/rules-base.json
deleted file mode 100644
index a2ce1b4..0000000
--- a/sources/digital/peripherals/io/gpio/gf180mcuD/flow/orfs/gpio_tl_32b/rules-base.json
+++ /dev/null
@@ -1,102 +0,0 @@
-{
- "synth__design__instance__area__stdcell": {
- "value": 83700.0,
- "compare": "<="
- },
- "constraints__clocks__count": {
- "value": 1,
- "compare": "=="
- },
- "placeopt__design__instance__area": {
- "value": 90174,
- "compare": "<="
- },
- "placeopt__design__instance__count__stdcell": {
- "value": 2510,
- "compare": "<="
- },
- "detailedplace__design__violations": {
- "value": 0,
- "compare": "=="
- },
- "cts__design__instance__count__setup_buffer": {
- "value": 218,
- "compare": "<="
- },
- "cts__design__instance__count__hold_buffer": {
- "value": 218,
- "compare": "<="
- },
- "cts__timing__setup__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "cts__timing__setup__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "cts__timing__hold__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "cts__timing__hold__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "globalroute__antenna_diodes_count": {
- "value": 100,
- "compare": "<="
- },
- "globalroute__timing__setup__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "globalroute__timing__setup__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "globalroute__timing__hold__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "globalroute__timing__hold__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "detailedroute__route__wirelength": {
- "value": 161158,
- "compare": "<="
- },
- "detailedroute__route__drc_errors": {
- "value": 0,
- "compare": "<="
- },
- "detailedroute__antenna__violating__nets": {
- "value": 0,
- "compare": "<="
- },
- "detailedroute__antenna_diodes_count": {
- "value": 100,
- "compare": "<="
- },
- "finish__timing__setup__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "finish__timing__setup__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "finish__timing__hold__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "finish__timing__hold__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "finish__design__instance__area": {
- "value": 94451,
- "compare": "<="
- }
-}
\ No newline at end of file
diff --git a/sources/digital/peripherals/io/gpio/gf180mcuD/flow/orfs/gpio_wb_32b/config.mk b/sources/digital/peripherals/io/gpio/gf180mcuD/flow/orfs/gpio_wb_32b/config.mk
deleted file mode 100644
index bcaaf13..0000000
--- a/sources/digital/peripherals/io/gpio/gf180mcuD/flow/orfs/gpio_wb_32b/config.mk
+++ /dev/null
@@ -1,29 +0,0 @@
-# SPDX-FileCopyrightText: 2026 aesc silicon
-#
-# SPDX-License-Identifier: CERN-OHL-W-2.0
-
-export DESIGN_NAME=gpio_wb_32b
-export DESIGN_NICKNAME=gpio_wb_32b
-export PLATFORM=gf180
-export VERILOG_FILES=${IP_ROOT}/rtl/verilog/gpio_wb_32b.v
-export DIE_AREA = 0.0 0.0 262.08 426.16
-export CORE_AREA = 11.20 11.76 250.88 414.96
-export LEC_CHECK = 0
-export MAX_ROUTING_LAYER = Metal4
-export PLACE_DENSITY = 0.80
-export CORNERS = WC TT BC
-export SDC_FILE=${IP_ROOT}/${PDK}/constraints/sdc/gpio_x_x.sdc
-export PDN_TCL=${IP_ROOT}/${PDK}/constraints/pdn/gpio_x_32b.tcl
-export IO_CONSTRAINTS=${IP_ROOT}/${PDK}/constraints/io/gpio_wb_32b.tcl
-export CDL_FILE = $(PDK_ROOT)/${PDK}/libs.ref/gf180mcu_fd_sc_mcu7t5v0/cdl/gf180mcu_fd_sc_mcu7t5v0.cdl
-export TRACK_OPTION = 7t
-export TECH_LEF = $(PDK_ROOT)/${PDK}/libs.ref/gf180mcu_fd_sc_mcu7t5v0/techlef/gf180mcu_fd_sc_mcu7t5v0__nom.tlef
-export SC_LEF = $(PDK_ROOT)/${PDK}/libs.ref/gf180mcu_fd_sc_mcu7t5v0/lef/gf180mcu_fd_sc_mcu7t5v0.lef
-export BC_LIB_FILES = $(PDK_ROOT)/${PDK}/libs.ref/gf180mcu_fd_sc_mcu7t5v0/lib/gf180mcu_fd_sc_mcu7t5v0__ff_n40C_5v50.lib
-export WC_LIB_FILES = $(PDK_ROOT)/${PDK}/libs.ref/gf180mcu_fd_sc_mcu7t5v0/lib/gf180mcu_fd_sc_mcu7t5v0__ss_125C_4v50.lib
-export TT_LIB_FILES = $(PDK_ROOT)/${PDK}/libs.ref/gf180mcu_fd_sc_mcu7t5v0/lib/gf180mcu_fd_sc_mcu7t5v0__tt_025C_5v00.lib
-export TT_LIB_FILES += $(ADDITIONAL_LIBS)
-export WC_LIB_FILES += $(ADDITIONAL_SLOW_LIBS)
-export BC_LIB_FILES += $(ADDITIONAL_FAST_LIBS)
-export GDS_FILES = $(PDK_ROOT)/${PDK}/libs.ref/gf180mcu_fd_sc_mcu7t5v0/gds/gf180mcu_fd_sc_mcu7t5v0.gds
-export GDS_FILES += $(ADDITIONAL_GDS)
diff --git a/sources/digital/peripherals/io/gpio/gf180mcuD/flow/orfs/gpio_wb_32b/rules-base.json b/sources/digital/peripherals/io/gpio/gf180mcuD/flow/orfs/gpio_wb_32b/rules-base.json
deleted file mode 100644
index 3ff1e77..0000000
--- a/sources/digital/peripherals/io/gpio/gf180mcuD/flow/orfs/gpio_wb_32b/rules-base.json
+++ /dev/null
@@ -1,102 +0,0 @@
-{
- "synth__design__instance__area__stdcell": {
- "value": 77400.0,
- "compare": "<="
- },
- "constraints__clocks__count": {
- "value": 1,
- "compare": "=="
- },
- "placeopt__design__instance__area": {
- "value": 83765,
- "compare": "<="
- },
- "placeopt__design__instance__count__stdcell": {
- "value": 2337,
- "compare": "<="
- },
- "detailedplace__design__violations": {
- "value": 0,
- "compare": "=="
- },
- "cts__design__instance__count__setup_buffer": {
- "value": 203,
- "compare": "<="
- },
- "cts__design__instance__count__hold_buffer": {
- "value": 203,
- "compare": "<="
- },
- "cts__timing__setup__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "cts__timing__setup__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "cts__timing__hold__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "cts__timing__hold__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "globalroute__antenna_diodes_count": {
- "value": 100,
- "compare": "<="
- },
- "globalroute__timing__setup__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "globalroute__timing__setup__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "globalroute__timing__hold__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "globalroute__timing__hold__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "detailedroute__route__wirelength": {
- "value": 142255,
- "compare": "<="
- },
- "detailedroute__route__drc_errors": {
- "value": 0,
- "compare": "<="
- },
- "detailedroute__antenna__violating__nets": {
- "value": 0,
- "compare": "<="
- },
- "detailedroute__antenna_diodes_count": {
- "value": 100,
- "compare": "<="
- },
- "finish__timing__setup__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "finish__timing__setup__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "finish__timing__hold__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "finish__timing__hold__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "finish__design__instance__area": {
- "value": 87748,
- "compare": "<="
- }
-}
\ No newline at end of file
diff --git a/sources/digital/peripherals/io/gpio/ihp-sg13g2/constraints/io/gpio_tl_32b.tcl b/sources/digital/peripherals/io/gpio/ihp-sg13g2/constraints/io/gpio_tl_32b.tcl
index 3d3ba39..2d971ef 100644
--- a/sources/digital/peripherals/io/gpio/ihp-sg13g2/constraints/io/gpio_tl_32b.tcl
+++ b/sources/digital/peripherals/io/gpio/ihp-sg13g2/constraints/io/gpio_tl_32b.tcl
@@ -36,7 +36,8 @@ set ::m2_pin_sz [expr {double([$m2_layer getMinWidth]) / $::dbu}]
# Pin length must satisfy the minimum metal area rule: area = width × length.
# Use max(pitch, minArea / minWidth) so the pin rectangle is always DRC-clean.
set m2_pitch [expr {double([$m2_layer getPitch]) / $::dbu}]
-set m2_minarea [$m2_layer getArea]
+# getArea returns the min-area rule in dbu^2; convert to um^2 before use.
+set m2_minarea [expr {double([$m2_layer getArea]) / ($::dbu * $::dbu)}]
set ::m2_pin_len [expr {max($m2_pitch, $m2_minarea / $::m2_pin_sz)}]
# Metal3 — vertical layer → top edge pins
diff --git a/sources/digital/peripherals/io/gpio/ihp-sg13g2/flow/librelane/gpio_apb_32b.yml b/sources/digital/peripherals/io/gpio/ihp-sg13g2/flow/librelane/gpio_apb_32b.yml
new file mode 100644
index 0000000..b64b582
--- /dev/null
+++ b/sources/digital/peripherals/io/gpio/ihp-sg13g2/flow/librelane/gpio_apb_32b.yml
@@ -0,0 +1,41 @@
+# SPDX-FileCopyrightText: 2026 aesc silicon
+#
+# SPDX-License-Identifier: CERN-OHL-W-2.0
+
+meta:
+ version: 3
+ flow: Classic
+ substituting_steps:
+ "+OpenROAD.IOPlacement": "Aesc.FixedIOPlacement"
+
+DESIGN_NAME: gpio_apb_32b
+PDK: ihp-sg13g2
+VERILOG_FILES:
+ - dir::../../../rtl/verilog/gpio_apb_32b.v
+LINTER_DISABLE_WARNINGS: [TIMESCALEMOD]
+
+CLOCK_PORT: clk
+CLOCK_PERIOD: 20.00
+
+PNR_SDC_FILE: ref::$DESIGN_DIR/../../constraints/sdc/gpio_x_x.sdc
+SIGNOFF_SDC_FILE: ref::$DESIGN_DIR/../../constraints/sdc/gpio_x_x.sdc
+
+PDN_CFG: ref::$DESIGN_DIR/../../constraints/pdn/gpio_x_32b.tcl
+
+FIXED_IO_SCRIPT: ref::$DESIGN_DIR/../../constraints/io/gpio_apb_32b.tcl
+
+FP_SIZING: absolute
+DIE_AREA: [0.0, 0.0, 171.46, 367.64]
+CORE_AREA: [11.52, 11.34, 159.94, 356.30]
+PL_TARGET_DENSITY_PCT: 80
+RT_MAX_LAYER: Metal5
+
+PL_RESIZER_HOLD_SLACK_MARGIN: 0.05
+
+VDD_NETS: [VDD]
+GND_NETS: [VSS]
+
+PRIMARY_GDSII_STREAMOUT_TOOL: klayout
+
+RUN_MAGIC_DRC: false
+RUN_GDSCHECK_DRC: true
diff --git a/sources/digital/peripherals/io/gpio/ihp-sg13g2/flow/librelane/gpio_tl_32b.yml b/sources/digital/peripherals/io/gpio/ihp-sg13g2/flow/librelane/gpio_tl_32b.yml
new file mode 100644
index 0000000..ede8a68
--- /dev/null
+++ b/sources/digital/peripherals/io/gpio/ihp-sg13g2/flow/librelane/gpio_tl_32b.yml
@@ -0,0 +1,41 @@
+# SPDX-FileCopyrightText: 2026 aesc silicon
+#
+# SPDX-License-Identifier: CERN-OHL-W-2.0
+
+meta:
+ version: 3
+ flow: Classic
+ substituting_steps:
+ "+OpenROAD.IOPlacement": "Aesc.FixedIOPlacement"
+
+DESIGN_NAME: gpio_tl_32b
+PDK: ihp-sg13g2
+VERILOG_FILES:
+ - dir::../../../rtl/verilog/gpio_tl_32b.v
+LINTER_DISABLE_WARNINGS: [TIMESCALEMOD]
+
+CLOCK_PORT: clk
+CLOCK_PERIOD: 20.00
+
+PNR_SDC_FILE: ref::$DESIGN_DIR/../../constraints/sdc/gpio_x_x.sdc
+SIGNOFF_SDC_FILE: ref::$DESIGN_DIR/../../constraints/sdc/gpio_x_x.sdc
+
+PDN_CFG: ref::$DESIGN_DIR/../../constraints/pdn/gpio_x_32b.tcl
+
+FIXED_IO_SCRIPT: ref::$DESIGN_DIR/../../constraints/io/gpio_tl_32b.tcl
+
+FP_SIZING: absolute
+DIE_AREA: [0.0, 0.0, 188.29, 359.92]
+CORE_AREA: [11.52, 11.34, 176.77, 348.58]
+PL_TARGET_DENSITY_PCT: 80
+RT_MAX_LAYER: Metal5
+
+PL_RESIZER_HOLD_SLACK_MARGIN: 0.05
+
+VDD_NETS: [VDD]
+GND_NETS: [VSS]
+
+PRIMARY_GDSII_STREAMOUT_TOOL: klayout
+
+RUN_MAGIC_DRC: false
+RUN_GDSCHECK_DRC: true
diff --git a/sources/digital/peripherals/io/gpio/ihp-sg13g2/flow/librelane/gpio_wb_32b.yml b/sources/digital/peripherals/io/gpio/ihp-sg13g2/flow/librelane/gpio_wb_32b.yml
new file mode 100644
index 0000000..d211e20
--- /dev/null
+++ b/sources/digital/peripherals/io/gpio/ihp-sg13g2/flow/librelane/gpio_wb_32b.yml
@@ -0,0 +1,41 @@
+# SPDX-FileCopyrightText: 2026 aesc silicon
+#
+# SPDX-License-Identifier: CERN-OHL-W-2.0
+
+meta:
+ version: 3
+ flow: Classic
+ substituting_steps:
+ "+OpenROAD.IOPlacement": "Aesc.FixedIOPlacement"
+
+DESIGN_NAME: gpio_wb_32b
+PDK: ihp-sg13g2
+VERILOG_FILES:
+ - dir::../../../rtl/verilog/gpio_wb_32b.v
+LINTER_DISABLE_WARNINGS: [TIMESCALEMOD]
+
+CLOCK_PORT: clk
+CLOCK_PERIOD: 20.00
+
+PNR_SDC_FILE: ref::$DESIGN_DIR/../../constraints/sdc/gpio_x_x.sdc
+SIGNOFF_SDC_FILE: ref::$DESIGN_DIR/../../constraints/sdc/gpio_x_x.sdc
+
+PDN_CFG: ref::$DESIGN_DIR/../../constraints/pdn/gpio_x_32b.tcl
+
+FIXED_IO_SCRIPT: ref::$DESIGN_DIR/../../constraints/io/gpio_wb_32b.tcl
+
+FP_SIZING: absolute
+DIE_AREA: [0.0, 0.0, 171.46, 367.64]
+CORE_AREA: [11.52, 11.34, 159.94, 356.30]
+PL_TARGET_DENSITY_PCT: 80
+RT_MAX_LAYER: Metal5
+
+PL_RESIZER_HOLD_SLACK_MARGIN: 0.05
+
+VDD_NETS: [VDD]
+GND_NETS: [VSS]
+
+PRIMARY_GDSII_STREAMOUT_TOOL: klayout
+
+RUN_MAGIC_DRC: false
+RUN_GDSCHECK_DRC: true
diff --git a/sources/digital/peripherals/io/gpio/ihp-sg13g2/flow/orfs/gpio_apb_32b/config.mk b/sources/digital/peripherals/io/gpio/ihp-sg13g2/flow/orfs/gpio_apb_32b/config.mk
deleted file mode 100644
index a889a26..0000000
--- a/sources/digital/peripherals/io/gpio/ihp-sg13g2/flow/orfs/gpio_apb_32b/config.mk
+++ /dev/null
@@ -1,29 +0,0 @@
-# SPDX-FileCopyrightText: 2026 aesc silicon
-#
-# SPDX-License-Identifier: CERN-OHL-W-2.0
-
-export DESIGN_NAME=gpio_apb_32b
-export DESIGN_NICKNAME=gpio_apb_32b
-export PLATFORM=ihp-sg13g2
-export VERILOG_FILES=${IP_ROOT}/rtl/verilog/gpio_apb_32b.v
-export DIE_AREA = 0.0 0.0 161.28 343.98
-export CORE_AREA = 11.52 11.34 149.76 332.64
-export LEC_CHECK = 0
-export MAX_ROUTING_LAYER = Metal5
-export PLACE_DENSITY = 0.80
-export CORNERS = slow typ fast
-export SDC_FILE=${IP_ROOT}/${PDK}/constraints/sdc/gpio_x_x.sdc
-export PDN_TCL=${IP_ROOT}/${PDK}/constraints/pdn/gpio_x_32b.tcl
-export IO_CONSTRAINTS=${IP_ROOT}/${PDK}/constraints/io/gpio_apb_32b.tcl
-export KLAYOUT_LVS_FILE = $(PDK_ROOT)/ihp-sg13g2/libs.tech/klayout/tech/lvs/sg13g2.lvs
-export LOAD_ADDITIONAL_FILES = 0
-export TECH_LEF = $(PDK_ROOT)/ihp-sg13g2/libs.ref/sg13g2_stdcell/lef/sg13g2_tech.lef
-export SC_LEF = $(PDK_ROOT)/ihp-sg13g2/libs.ref/sg13g2_stdcell/lef/sg13g2_stdcell.lef
-export TYP_LIB_FILES = $(PDK_ROOT)/ihp-sg13g2/libs.ref/sg13g2_stdcell/lib/sg13g2_stdcell_typ_1p20V_25C.lib
-export SLOW_LIB_FILES = $(PDK_ROOT)/ihp-sg13g2/libs.ref/sg13g2_stdcell/lib/sg13g2_stdcell_slow_1p08V_125C.lib
-export FAST_LIB_FILES = $(PDK_ROOT)/ihp-sg13g2/libs.ref/sg13g2_stdcell/lib/sg13g2_stdcell_fast_1p32V_m40C.lib
-export TYP_LIB_FILES += $(ADDITIONAL_LIBS)
-export SLOW_LIB_FILES += $(ADDITIONAL_SLOW_LIBS)
-export FAST_LIB_FILES += $(ADDITIONAL_FAST_LIBS)
-export GDS_FILES = $(PDK_ROOT)/ihp-sg13g2/libs.ref/sg13g2_stdcell/gds/sg13g2_stdcell.gds
-export GDS_FILES += $(ADDITIONAL_GDS)
diff --git a/sources/digital/peripherals/io/gpio/ihp-sg13g2/flow/orfs/gpio_apb_32b/rules-base.json b/sources/digital/peripherals/io/gpio/ihp-sg13g2/flow/orfs/gpio_apb_32b/rules-base.json
deleted file mode 100644
index 67b6161..0000000
--- a/sources/digital/peripherals/io/gpio/ihp-sg13g2/flow/orfs/gpio_apb_32b/rules-base.json
+++ /dev/null
@@ -1,102 +0,0 @@
-{
- "synth__design__instance__area__stdcell": {
- "value": 39700.0,
- "compare": "<="
- },
- "constraints__clocks__count": {
- "value": 1,
- "compare": "=="
- },
- "placeopt__design__instance__area": {
- "value": 41297,
- "compare": "<="
- },
- "placeopt__design__instance__count__stdcell": {
- "value": 2317,
- "compare": "<="
- },
- "detailedplace__design__violations": {
- "value": 0,
- "compare": "=="
- },
- "cts__design__instance__count__setup_buffer": {
- "value": 202,
- "compare": "<="
- },
- "cts__design__instance__count__hold_buffer": {
- "value": 202,
- "compare": "<="
- },
- "cts__timing__setup__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "cts__timing__setup__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "cts__timing__hold__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "cts__timing__hold__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "globalroute__antenna_diodes_count": {
- "value": 100,
- "compare": "<="
- },
- "globalroute__timing__setup__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "globalroute__timing__setup__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "globalroute__timing__hold__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "globalroute__timing__hold__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "detailedroute__route__wirelength": {
- "value": 113763,
- "compare": "<="
- },
- "detailedroute__route__drc_errors": {
- "value": 0,
- "compare": "<="
- },
- "detailedroute__antenna__violating__nets": {
- "value": 0,
- "compare": "<="
- },
- "detailedroute__antenna_diodes_count": {
- "value": 100,
- "compare": "<="
- },
- "finish__timing__setup__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "finish__timing__setup__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "finish__timing__hold__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "finish__timing__hold__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "finish__design__instance__area": {
- "value": 43386,
- "compare": "<="
- }
-}
\ No newline at end of file
diff --git a/sources/digital/peripherals/io/gpio/ihp-sg13g2/flow/orfs/gpio_tl_32b/config.mk b/sources/digital/peripherals/io/gpio/ihp-sg13g2/flow/orfs/gpio_tl_32b/config.mk
deleted file mode 100644
index 91cb639..0000000
--- a/sources/digital/peripherals/io/gpio/ihp-sg13g2/flow/orfs/gpio_tl_32b/config.mk
+++ /dev/null
@@ -1,29 +0,0 @@
-# SPDX-FileCopyrightText: 2026 aesc silicon
-#
-# SPDX-License-Identifier: CERN-OHL-W-2.0
-
-export DESIGN_NAME=gpio_tl_32b
-export DESIGN_NICKNAME=gpio_tl_32b
-export PLATFORM=ihp-sg13g2
-export VERILOG_FILES=${IP_ROOT}/rtl/verilog/gpio_tl_32b.v
-export DIE_AREA = 0.0 0.0 180.48 343.98
-export CORE_AREA = 11.52 11.34 168.96 332.64
-export LEC_CHECK = 0
-export MAX_ROUTING_LAYER = Metal5
-export PLACE_DENSITY = 0.80
-export CORNERS = slow typ fast
-export SDC_FILE=${IP_ROOT}/${PDK}/constraints/sdc/gpio_x_x.sdc
-export PDN_TCL=${IP_ROOT}/${PDK}/constraints/pdn/gpio_x_32b.tcl
-export IO_CONSTRAINTS=${IP_ROOT}/${PDK}/constraints/io/gpio_tl_32b.tcl
-export KLAYOUT_LVS_FILE = $(PDK_ROOT)/ihp-sg13g2/libs.tech/klayout/tech/lvs/sg13g2.lvs
-export LOAD_ADDITIONAL_FILES = 0
-export TECH_LEF = $(PDK_ROOT)/ihp-sg13g2/libs.ref/sg13g2_stdcell/lef/sg13g2_tech.lef
-export SC_LEF = $(PDK_ROOT)/ihp-sg13g2/libs.ref/sg13g2_stdcell/lef/sg13g2_stdcell.lef
-export TYP_LIB_FILES = $(PDK_ROOT)/ihp-sg13g2/libs.ref/sg13g2_stdcell/lib/sg13g2_stdcell_typ_1p20V_25C.lib
-export SLOW_LIB_FILES = $(PDK_ROOT)/ihp-sg13g2/libs.ref/sg13g2_stdcell/lib/sg13g2_stdcell_slow_1p08V_125C.lib
-export FAST_LIB_FILES = $(PDK_ROOT)/ihp-sg13g2/libs.ref/sg13g2_stdcell/lib/sg13g2_stdcell_fast_1p32V_m40C.lib
-export TYP_LIB_FILES += $(ADDITIONAL_LIBS)
-export SLOW_LIB_FILES += $(ADDITIONAL_SLOW_LIBS)
-export FAST_LIB_FILES += $(ADDITIONAL_FAST_LIBS)
-export GDS_FILES = $(PDK_ROOT)/ihp-sg13g2/libs.ref/sg13g2_stdcell/gds/sg13g2_stdcell.gds
-export GDS_FILES += $(ADDITIONAL_GDS)
diff --git a/sources/digital/peripherals/io/gpio/ihp-sg13g2/flow/orfs/gpio_tl_32b/rules-base.json b/sources/digital/peripherals/io/gpio/ihp-sg13g2/flow/orfs/gpio_tl_32b/rules-base.json
deleted file mode 100644
index a460d2b..0000000
--- a/sources/digital/peripherals/io/gpio/ihp-sg13g2/flow/orfs/gpio_tl_32b/rules-base.json
+++ /dev/null
@@ -1,102 +0,0 @@
-{
- "synth__design__instance__area__stdcell": {
- "value": 43500.0,
- "compare": "<="
- },
- "constraints__clocks__count": {
- "value": 1,
- "compare": "=="
- },
- "placeopt__design__instance__area": {
- "value": 44882,
- "compare": "<="
- },
- "placeopt__design__instance__count__stdcell": {
- "value": 2512,
- "compare": "<="
- },
- "detailedplace__design__violations": {
- "value": 0,
- "compare": "=="
- },
- "cts__design__instance__count__setup_buffer": {
- "value": 218,
- "compare": "<="
- },
- "cts__design__instance__count__hold_buffer": {
- "value": 218,
- "compare": "<="
- },
- "cts__timing__setup__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "cts__timing__setup__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "cts__timing__hold__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "cts__timing__hold__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "globalroute__antenna_diodes_count": {
- "value": 100,
- "compare": "<="
- },
- "globalroute__timing__setup__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "globalroute__timing__setup__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "globalroute__timing__hold__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "globalroute__timing__hold__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "detailedroute__route__wirelength": {
- "value": 114942,
- "compare": "<="
- },
- "detailedroute__route__drc_errors": {
- "value": 0,
- "compare": "<="
- },
- "detailedroute__antenna__violating__nets": {
- "value": 0,
- "compare": "<="
- },
- "detailedroute__antenna_diodes_count": {
- "value": 100,
- "compare": "<="
- },
- "finish__timing__setup__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "finish__timing__setup__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "finish__timing__hold__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "finish__timing__hold__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "finish__design__instance__area": {
- "value": 46977,
- "compare": "<="
- }
-}
\ No newline at end of file
diff --git a/sources/digital/peripherals/io/gpio/ihp-sg13g2/flow/orfs/gpio_wb_32b/config.mk b/sources/digital/peripherals/io/gpio/ihp-sg13g2/flow/orfs/gpio_wb_32b/config.mk
deleted file mode 100644
index ffa97fd..0000000
--- a/sources/digital/peripherals/io/gpio/ihp-sg13g2/flow/orfs/gpio_wb_32b/config.mk
+++ /dev/null
@@ -1,30 +0,0 @@
-# SPDX-FileCopyrightText: 2026 aesc silicon
-#
-# SPDX-License-Identifier: CERN-OHL-W-2.0
-
-export DESIGN_NAME=gpio_wb_32b
-export DESIGN_NICKNAME=gpio_wb_32b
-export PLATFORM=ihp-sg13g2
-export VERILOG_FILES=${IP_ROOT}/rtl/verilog/gpio_wb_32b.v
-export DIE_AREA = 0.0 0.0 161.28 343.98
-export CORE_AREA = 11.52 11.34 149.76 332.64
-export LEC_CHECK = 0
-export MAX_ROUTING_LAYER = Metal5
-export PLACE_DENSITY = 0.80
-export MAX_REPAIR_ANTENNAS_ITER_DRT = 10
-export CORNERS = slow typ fast
-export SDC_FILE=${IP_ROOT}/${PDK}/constraints/sdc/gpio_x_x.sdc
-export PDN_TCL=${IP_ROOT}/${PDK}/constraints/pdn/gpio_x_32b.tcl
-export IO_CONSTRAINTS=${IP_ROOT}/${PDK}/constraints/io/gpio_wb_32b.tcl
-export KLAYOUT_LVS_FILE = $(PDK_ROOT)/ihp-sg13g2/libs.tech/klayout/tech/lvs/sg13g2.lvs
-export LOAD_ADDITIONAL_FILES = 0
-export TECH_LEF = $(PDK_ROOT)/ihp-sg13g2/libs.ref/sg13g2_stdcell/lef/sg13g2_tech.lef
-export SC_LEF = $(PDK_ROOT)/ihp-sg13g2/libs.ref/sg13g2_stdcell/lef/sg13g2_stdcell.lef
-export TYP_LIB_FILES = $(PDK_ROOT)/ihp-sg13g2/libs.ref/sg13g2_stdcell/lib/sg13g2_stdcell_typ_1p20V_25C.lib
-export SLOW_LIB_FILES = $(PDK_ROOT)/ihp-sg13g2/libs.ref/sg13g2_stdcell/lib/sg13g2_stdcell_slow_1p08V_125C.lib
-export FAST_LIB_FILES = $(PDK_ROOT)/ihp-sg13g2/libs.ref/sg13g2_stdcell/lib/sg13g2_stdcell_fast_1p32V_m40C.lib
-export TYP_LIB_FILES += $(ADDITIONAL_LIBS)
-export SLOW_LIB_FILES += $(ADDITIONAL_SLOW_LIBS)
-export FAST_LIB_FILES += $(ADDITIONAL_FAST_LIBS)
-export GDS_FILES = $(PDK_ROOT)/ihp-sg13g2/libs.ref/sg13g2_stdcell/gds/sg13g2_stdcell.gds
-export GDS_FILES += $(ADDITIONAL_GDS)
diff --git a/sources/digital/peripherals/io/gpio/ihp-sg13g2/flow/orfs/gpio_wb_32b/rules-base.json b/sources/digital/peripherals/io/gpio/ihp-sg13g2/flow/orfs/gpio_wb_32b/rules-base.json
deleted file mode 100644
index 8bb25a6..0000000
--- a/sources/digital/peripherals/io/gpio/ihp-sg13g2/flow/orfs/gpio_wb_32b/rules-base.json
+++ /dev/null
@@ -1,102 +0,0 @@
-{
- "synth__design__instance__area__stdcell": {
- "value": 39200.0,
- "compare": "<="
- },
- "constraints__clocks__count": {
- "value": 1,
- "compare": "=="
- },
- "placeopt__design__instance__area": {
- "value": 41091,
- "compare": "<="
- },
- "placeopt__design__instance__count__stdcell": {
- "value": 2290,
- "compare": "<="
- },
- "detailedplace__design__violations": {
- "value": 0,
- "compare": "=="
- },
- "cts__design__instance__count__setup_buffer": {
- "value": 199,
- "compare": "<="
- },
- "cts__design__instance__count__hold_buffer": {
- "value": 199,
- "compare": "<="
- },
- "cts__timing__setup__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "cts__timing__setup__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "cts__timing__hold__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "cts__timing__hold__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "globalroute__antenna_diodes_count": {
- "value": 100,
- "compare": "<="
- },
- "globalroute__timing__setup__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "globalroute__timing__setup__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "globalroute__timing__hold__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "globalroute__timing__hold__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "detailedroute__route__wirelength": {
- "value": 108875,
- "compare": "<="
- },
- "detailedroute__route__drc_errors": {
- "value": 0,
- "compare": "<="
- },
- "detailedroute__antenna__violating__nets": {
- "value": 0,
- "compare": "<="
- },
- "detailedroute__antenna_diodes_count": {
- "value": 100,
- "compare": "<="
- },
- "finish__timing__setup__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "finish__timing__setup__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "finish__timing__hold__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "finish__timing__hold__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "finish__design__instance__area": {
- "value": 43319,
- "compare": "<="
- }
-}
\ No newline at end of file
diff --git a/sources/digital/peripherals/io/gpio/manifest.yml b/sources/digital/peripherals/io/gpio/manifest.yml
index daa0ffe..ecb5306 100644
--- a/sources/digital/peripherals/io/gpio/manifest.yml
+++ b/sources/digital/peripherals/io/gpio/manifest.yml
@@ -64,11 +64,11 @@ macros:
io: gf180mcuD/constraints/io/gpio_apb_32b.tcl
flow:
ihp-sg13g2:
- orfs: ihp-sg13g2/flow/orfs/gpio_apb_32b/config.mk
+ librelane: ihp-sg13g2/flow/librelane/gpio_apb_32b.yml
sky130A:
- orfs: sky130A/flow/orfs/gpio_apb_32b/config.mk
+ librelane: sky130A/flow/librelane/gpio_apb_32b.yml
gf180mcuD:
- orfs: gf180mcuD/flow/orfs/gpio_apb_32b/config.mk
+ librelane: gf180mcuD/flow/librelane/gpio_apb_32b.yml
- name: gpio_wb_32b
description: 32-bit GPIO with Wishbone interface
@@ -114,11 +114,11 @@ macros:
io: gf180mcuD/constraints/io/gpio_wb_32b.tcl
flow:
ihp-sg13g2:
- orfs: ihp-sg13g2/flow/orfs/gpio_wb_32b/config.mk
+ librelane: ihp-sg13g2/flow/librelane/gpio_wb_32b.yml
sky130A:
- orfs: sky130A/flow/orfs/gpio_wb_32b/config.mk
+ librelane: sky130A/flow/librelane/gpio_wb_32b.yml
gf180mcuD:
- orfs: gf180mcuD/flow/orfs/gpio_wb_32b/config.mk
+ librelane: gf180mcuD/flow/librelane/gpio_wb_32b.yml
- name: gpio_tl_32b
description: 32-bit GPIO with TileLink TL-UL interface
@@ -175,11 +175,11 @@ macros:
io: gf180mcuD/constraints/io/gpio_tl_32b.tcl
flow:
ihp-sg13g2:
- orfs: ihp-sg13g2/flow/orfs/gpio_tl_32b/config.mk
+ librelane: ihp-sg13g2/flow/librelane/gpio_tl_32b.yml
sky130A:
- orfs: sky130A/flow/orfs/gpio_tl_32b/config.mk
+ librelane: sky130A/flow/librelane/gpio_tl_32b.yml
gf180mcuD:
- orfs: gf180mcuD/flow/orfs/gpio_tl_32b/config.mk
+ librelane: gf180mcuD/flow/librelane/gpio_tl_32b.yml
docs:
- doc/gpio.md
diff --git a/sources/digital/peripherals/io/gpio/sky130A/constraints/io/gpio_tl_32b.tcl b/sources/digital/peripherals/io/gpio/sky130A/constraints/io/gpio_tl_32b.tcl
index bc705cf..251827d 100644
--- a/sources/digital/peripherals/io/gpio/sky130A/constraints/io/gpio_tl_32b.tcl
+++ b/sources/digital/peripherals/io/gpio/sky130A/constraints/io/gpio_tl_32b.tcl
@@ -39,7 +39,8 @@ set ::m2_pin_sz [expr {double([$m2_layer getMinWidth]) / $::dbu}]
# Also ensures pin_len × minWidth ≥ minArea (DRC area rule).
set m2_pitch_dbu [$m2_layer getPitch]
set m2_minwidth_dbu [$m2_layer getMinWidth]
-set m2_minarea_dbu2 [expr {int([$m2_layer getArea] * $::dbu * $::dbu + 0.5)}]
+# getArea already returns the min-area rule in dbu^2 (do not scale by dbu again).
+set m2_minarea_dbu2 [expr {int([$m2_layer getArea] + 0.5)}]
set mfg_grid_dbu [$tech getManufacturingGrid]
set snap_dbu [expr {2 * $mfg_grid_dbu}]
set min_len_dbu [expr {int(ceil(double($m2_minarea_dbu2) / $m2_minwidth_dbu))}]
diff --git a/sources/digital/peripherals/io/gpio/sky130A/flow/librelane/gpio_apb_32b.yml b/sources/digital/peripherals/io/gpio/sky130A/flow/librelane/gpio_apb_32b.yml
new file mode 100644
index 0000000..d2a20cf
--- /dev/null
+++ b/sources/digital/peripherals/io/gpio/sky130A/flow/librelane/gpio_apb_32b.yml
@@ -0,0 +1,44 @@
+# SPDX-FileCopyrightText: 2026 aesc silicon
+#
+# SPDX-License-Identifier: CERN-OHL-W-2.0
+
+meta:
+ version: 3
+ flow: Classic
+ substituting_steps:
+ "+OpenROAD.IOPlacement": "Aesc.FixedIOPlacement"
+
+DESIGN_NAME: gpio_apb_32b
+PDK: sky130A
+VERILOG_FILES:
+ - dir::../../../rtl/verilog/gpio_apb_32b.v
+LINTER_DISABLE_WARNINGS: [TIMESCALEMOD]
+
+CLOCK_PORT: clk
+CLOCK_PERIOD: 20.00
+
+PNR_SDC_FILE: ref::$DESIGN_DIR/../../constraints/sdc/gpio_x_x.sdc
+SIGNOFF_SDC_FILE: ref::$DESIGN_DIR/../../constraints/sdc/gpio_x_x.sdc
+
+PDN_CFG: ref::$DESIGN_DIR/../../constraints/pdn/gpio_x_32b.tcl
+
+FIXED_IO_SCRIPT: ref::$DESIGN_DIR/../../constraints/io/gpio_apb_32b.tcl
+
+FP_SIZING: absolute
+DIE_AREA: [0.0, 0.0, 181.43, 216.69]
+CORE_AREA: [11.50, 10.88, 169.93, 205.81]
+PL_TARGET_DENSITY_PCT: 80
+RT_MAX_LAYER: met4
+
+PL_RESIZER_HOLD_SLACK_MARGIN: 0.05
+
+DESIGN_REPAIR_MAX_SLEW_PCT: 50
+DESIGN_REPAIR_MAX_CAP_PCT: 50
+
+VDD_NETS: [VDD]
+GND_NETS: [VSS]
+
+PRIMARY_GDSII_STREAMOUT_TOOL: klayout
+
+RUN_MAGIC_DRC: false
+RUN_GDSCHECK_DRC: true
diff --git a/sources/digital/peripherals/io/gpio/sky130A/flow/librelane/gpio_tl_32b.yml b/sources/digital/peripherals/io/gpio/sky130A/flow/librelane/gpio_tl_32b.yml
new file mode 100644
index 0000000..8dea41f
--- /dev/null
+++ b/sources/digital/peripherals/io/gpio/sky130A/flow/librelane/gpio_tl_32b.yml
@@ -0,0 +1,44 @@
+# SPDX-FileCopyrightText: 2026 aesc silicon
+#
+# SPDX-License-Identifier: CERN-OHL-W-2.0
+
+meta:
+ version: 3
+ flow: Classic
+ substituting_steps:
+ "+OpenROAD.IOPlacement": "Aesc.FixedIOPlacement"
+
+DESIGN_NAME: gpio_tl_32b
+PDK: sky130A
+VERILOG_FILES:
+ - dir::../../../rtl/verilog/gpio_tl_32b.v
+LINTER_DISABLE_WARNINGS: [TIMESCALEMOD]
+
+CLOCK_PORT: clk
+CLOCK_PERIOD: 20.00
+
+PNR_SDC_FILE: ref::$DESIGN_DIR/../../constraints/sdc/gpio_x_x.sdc
+SIGNOFF_SDC_FILE: ref::$DESIGN_DIR/../../constraints/sdc/gpio_x_x.sdc
+
+PDN_CFG: ref::$DESIGN_DIR/../../constraints/pdn/gpio_x_32b.tcl
+
+FIXED_IO_SCRIPT: ref::$DESIGN_DIR/../../constraints/io/gpio_tl_32b.tcl
+
+FP_SIZING: absolute
+DIE_AREA: [0.0, 0.0, 185.93, 222.23]
+CORE_AREA: [11.50, 10.88, 174.43, 211.35]
+PL_TARGET_DENSITY_PCT: 80
+RT_MAX_LAYER: met4
+
+PL_RESIZER_HOLD_SLACK_MARGIN: 0.05
+
+DESIGN_REPAIR_MAX_SLEW_PCT: 50
+DESIGN_REPAIR_MAX_CAP_PCT: 50
+
+VDD_NETS: [VDD]
+GND_NETS: [VSS]
+
+PRIMARY_GDSII_STREAMOUT_TOOL: klayout
+
+RUN_MAGIC_DRC: false
+RUN_GDSCHECK_DRC: true
diff --git a/sources/digital/peripherals/io/gpio/sky130A/flow/librelane/gpio_wb_32b.yml b/sources/digital/peripherals/io/gpio/sky130A/flow/librelane/gpio_wb_32b.yml
new file mode 100644
index 0000000..25ca52a
--- /dev/null
+++ b/sources/digital/peripherals/io/gpio/sky130A/flow/librelane/gpio_wb_32b.yml
@@ -0,0 +1,44 @@
+# SPDX-FileCopyrightText: 2026 aesc silicon
+#
+# SPDX-License-Identifier: CERN-OHL-W-2.0
+
+meta:
+ version: 3
+ flow: Classic
+ substituting_steps:
+ "+OpenROAD.IOPlacement": "Aesc.FixedIOPlacement"
+
+DESIGN_NAME: gpio_wb_32b
+PDK: sky130A
+VERILOG_FILES:
+ - dir::../../../rtl/verilog/gpio_wb_32b.v
+LINTER_DISABLE_WARNINGS: [TIMESCALEMOD]
+
+CLOCK_PORT: clk
+CLOCK_PERIOD: 20.00
+
+PNR_SDC_FILE: ref::$DESIGN_DIR/../../constraints/sdc/gpio_x_x.sdc
+SIGNOFF_SDC_FILE: ref::$DESIGN_DIR/../../constraints/sdc/gpio_x_x.sdc
+
+PDN_CFG: ref::$DESIGN_DIR/../../constraints/pdn/gpio_x_32b.tcl
+
+FIXED_IO_SCRIPT: ref::$DESIGN_DIR/../../constraints/io/gpio_wb_32b.tcl
+
+FP_SIZING: absolute
+DIE_AREA: [0.0, 0.0, 181.43, 216.69]
+CORE_AREA: [11.50, 10.88, 169.93, 205.81]
+PL_TARGET_DENSITY_PCT: 80
+RT_MAX_LAYER: met4
+
+PL_RESIZER_HOLD_SLACK_MARGIN: 0.05
+
+DESIGN_REPAIR_MAX_SLEW_PCT: 50
+DESIGN_REPAIR_MAX_CAP_PCT: 50
+
+VDD_NETS: [VDD]
+GND_NETS: [VSS]
+
+PRIMARY_GDSII_STREAMOUT_TOOL: klayout
+
+RUN_MAGIC_DRC: false
+RUN_GDSCHECK_DRC: true
diff --git a/sources/digital/peripherals/io/gpio/sky130A/flow/orfs/gpio_apb_32b/config.mk b/sources/digital/peripherals/io/gpio/sky130A/flow/orfs/gpio_apb_32b/config.mk
deleted file mode 100644
index a8f0f3b..0000000
--- a/sources/digital/peripherals/io/gpio/sky130A/flow/orfs/gpio_apb_32b/config.mk
+++ /dev/null
@@ -1,27 +0,0 @@
-# SPDX-FileCopyrightText: 2026 aesc silicon
-#
-# SPDX-License-Identifier: CERN-OHL-W-2.0
-
-export DESIGN_NAME=gpio_apb_32b
-export DESIGN_NICKNAME=gpio_apb_32b
-export PLATFORM=sky130hd
-export VERILOG_FILES=${IP_ROOT}/rtl/verilog/gpio_apb_32b.v
-export DIE_AREA = 0.0 0.0 171.12 204.00
-export CORE_AREA = 11.50 10.88 159.62 193.12
-export LEC_CHECK = 0
-export MAX_ROUTING_LAYER = met4
-export PLACE_DENSITY = 0.80
-export CORNERS = slow typ fast
-export SDC_FILE=${IP_ROOT}/${PDK}/constraints/sdc/gpio_x_x.sdc
-export PDN_TCL=${IP_ROOT}/${PDK}/constraints/pdn/gpio_x_32b.tcl
-export IO_CONSTRAINTS=${IP_ROOT}/${PDK}/constraints/io/gpio_apb_32b.tcl
-export TECH_LEF = $(PDK_ROOT)/${PDK}/libs.ref/sky130_fd_sc_hd/techlef/sky130_fd_sc_hd__nom.tlef
-export SC_LEF = $(PDK_ROOT)/${PDK}/libs.ref/sky130_fd_sc_hd/lef/sky130_fd_sc_hd.lef
-export TYP_LIB_FILES = $(PDK_ROOT)/${PDK}/libs.ref/sky130_fd_sc_hd/lib/sky130_fd_sc_hd__tt_025C_1v80.lib
-export SLOW_LIB_FILES = $(PDK_ROOT)/${PDK}/libs.ref/sky130_fd_sc_hd/lib/sky130_fd_sc_hd__ss_100C_1v60.lib
-export FAST_LIB_FILES = $(PDK_ROOT)/${PDK}/libs.ref/sky130_fd_sc_hd/lib/sky130_fd_sc_hd__ff_n40C_1v95.lib
-export TYP_LIB_FILES += $(ADDITIONAL_LIBS)
-export SLOW_LIB_FILES += $(ADDITIONAL_SLOW_LIBS)
-export FAST_LIB_FILES += $(ADDITIONAL_FAST_LIBS)
-export GDS_FILES = $(PDK_ROOT)/${PDK}/libs.ref/sky130_fd_sc_hd/gds/sky130_fd_sc_hd.gds
-export GDS_FILES += $(ADDITIONAL_GDS)
diff --git a/sources/digital/peripherals/io/gpio/sky130A/flow/orfs/gpio_apb_32b/rules-base.json b/sources/digital/peripherals/io/gpio/sky130A/flow/orfs/gpio_apb_32b/rules-base.json
deleted file mode 100644
index 7716a1e..0000000
--- a/sources/digital/peripherals/io/gpio/sky130A/flow/orfs/gpio_apb_32b/rules-base.json
+++ /dev/null
@@ -1,102 +0,0 @@
-{
- "synth__design__instance__area__stdcell": {
- "value": 20800.0,
- "compare": "<="
- },
- "constraints__clocks__count": {
- "value": 1,
- "compare": "=="
- },
- "placeopt__design__instance__area": {
- "value": 22694,
- "compare": "<="
- },
- "placeopt__design__instance__count__stdcell": {
- "value": 2364,
- "compare": "<="
- },
- "detailedplace__design__violations": {
- "value": 0,
- "compare": "=="
- },
- "cts__design__instance__count__setup_buffer": {
- "value": 206,
- "compare": "<="
- },
- "cts__design__instance__count__hold_buffer": {
- "value": 206,
- "compare": "<="
- },
- "cts__timing__setup__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "cts__timing__setup__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "cts__timing__hold__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "cts__timing__hold__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "globalroute__antenna_diodes_count": {
- "value": 100,
- "compare": "<="
- },
- "globalroute__timing__setup__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "globalroute__timing__setup__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "globalroute__timing__hold__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "globalroute__timing__hold__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "detailedroute__route__wirelength": {
- "value": 93785,
- "compare": "<="
- },
- "detailedroute__route__drc_errors": {
- "value": 0,
- "compare": "<="
- },
- "detailedroute__antenna__violating__nets": {
- "value": 0,
- "compare": "<="
- },
- "detailedroute__antenna_diodes_count": {
- "value": 100,
- "compare": "<="
- },
- "finish__timing__setup__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "finish__timing__setup__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "finish__timing__hold__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "finish__timing__hold__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "finish__design__instance__area": {
- "value": 24405,
- "compare": "<="
- }
-}
\ No newline at end of file
diff --git a/sources/digital/peripherals/io/gpio/sky130A/flow/orfs/gpio_tl_32b/config.mk b/sources/digital/peripherals/io/gpio/sky130A/flow/orfs/gpio_tl_32b/config.mk
deleted file mode 100644
index b29ec87..0000000
--- a/sources/digital/peripherals/io/gpio/sky130A/flow/orfs/gpio_tl_32b/config.mk
+++ /dev/null
@@ -1,27 +0,0 @@
-# SPDX-FileCopyrightText: 2026 aesc silicon
-#
-# SPDX-License-Identifier: CERN-OHL-W-2.0
-
-export DESIGN_NAME=gpio_tl_32b
-export DESIGN_NICKNAME=gpio_tl_32b
-export PLATFORM=sky130hd
-export VERILOG_FILES=${IP_ROOT}/rtl/verilog/gpio_tl_32b.v
-export DIE_AREA = 0.0 0.0 171.12 204.00
-export CORE_AREA = 11.50 10.88 159.62 193.12
-export LEC_CHECK = 0
-export MAX_ROUTING_LAYER = met4
-export PLACE_DENSITY = 0.80
-export CORNERS = slow typ fast
-export SDC_FILE=${IP_ROOT}/${PDK}/constraints/sdc/gpio_x_x.sdc
-export PDN_TCL=${IP_ROOT}/${PDK}/constraints/pdn/gpio_x_32b.tcl
-export IO_CONSTRAINTS=${IP_ROOT}/${PDK}/constraints/io/gpio_tl_32b.tcl
-export TECH_LEF = $(PDK_ROOT)/${PDK}/libs.ref/sky130_fd_sc_hd/techlef/sky130_fd_sc_hd__nom.tlef
-export SC_LEF = $(PDK_ROOT)/${PDK}/libs.ref/sky130_fd_sc_hd/lef/sky130_fd_sc_hd.lef
-export TYP_LIB_FILES = $(PDK_ROOT)/${PDK}/libs.ref/sky130_fd_sc_hd/lib/sky130_fd_sc_hd__tt_025C_1v80.lib
-export SLOW_LIB_FILES = $(PDK_ROOT)/${PDK}/libs.ref/sky130_fd_sc_hd/lib/sky130_fd_sc_hd__ss_100C_1v60.lib
-export FAST_LIB_FILES = $(PDK_ROOT)/${PDK}/libs.ref/sky130_fd_sc_hd/lib/sky130_fd_sc_hd__ff_n40C_1v95.lib
-export TYP_LIB_FILES += $(ADDITIONAL_LIBS)
-export SLOW_LIB_FILES += $(ADDITIONAL_SLOW_LIBS)
-export FAST_LIB_FILES += $(ADDITIONAL_FAST_LIBS)
-export GDS_FILES = $(PDK_ROOT)/${PDK}/libs.ref/sky130_fd_sc_hd/gds/sky130_fd_sc_hd.gds
-export GDS_FILES += $(ADDITIONAL_GDS)
diff --git a/sources/digital/peripherals/io/gpio/sky130A/flow/orfs/gpio_tl_32b/rules-base.json b/sources/digital/peripherals/io/gpio/sky130A/flow/orfs/gpio_tl_32b/rules-base.json
deleted file mode 100644
index fa8cfd9..0000000
--- a/sources/digital/peripherals/io/gpio/sky130A/flow/orfs/gpio_tl_32b/rules-base.json
+++ /dev/null
@@ -1,102 +0,0 @@
-{
- "synth__design__instance__area__stdcell": {
- "value": 22200.0,
- "compare": "<="
- },
- "constraints__clocks__count": {
- "value": 1,
- "compare": "=="
- },
- "placeopt__design__instance__area": {
- "value": 24316,
- "compare": "<="
- },
- "placeopt__design__instance__count__stdcell": {
- "value": 2404,
- "compare": "<="
- },
- "detailedplace__design__violations": {
- "value": 0,
- "compare": "=="
- },
- "cts__design__instance__count__setup_buffer": {
- "value": 209,
- "compare": "<="
- },
- "cts__design__instance__count__hold_buffer": {
- "value": 209,
- "compare": "<="
- },
- "cts__timing__setup__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "cts__timing__setup__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "cts__timing__hold__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "cts__timing__hold__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "globalroute__antenna_diodes_count": {
- "value": 100,
- "compare": "<="
- },
- "globalroute__timing__setup__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "globalroute__timing__setup__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "globalroute__timing__hold__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "globalroute__timing__hold__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "detailedroute__route__wirelength": {
- "value": 89522,
- "compare": "<="
- },
- "detailedroute__route__drc_errors": {
- "value": 0,
- "compare": "<="
- },
- "detailedroute__antenna__violating__nets": {
- "value": 0,
- "compare": "<="
- },
- "detailedroute__antenna_diodes_count": {
- "value": 100,
- "compare": "<="
- },
- "finish__timing__setup__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "finish__timing__setup__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "finish__timing__hold__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "finish__timing__hold__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "finish__design__instance__area": {
- "value": 26260,
- "compare": "<="
- }
-}
\ No newline at end of file
diff --git a/sources/digital/peripherals/io/gpio/sky130A/flow/orfs/gpio_wb_32b/config.mk b/sources/digital/peripherals/io/gpio/sky130A/flow/orfs/gpio_wb_32b/config.mk
deleted file mode 100644
index 3a25187..0000000
--- a/sources/digital/peripherals/io/gpio/sky130A/flow/orfs/gpio_wb_32b/config.mk
+++ /dev/null
@@ -1,27 +0,0 @@
-# SPDX-FileCopyrightText: 2026 aesc silicon
-#
-# SPDX-License-Identifier: CERN-OHL-W-2.0
-
-export DESIGN_NAME=gpio_wb_32b
-export DESIGN_NICKNAME=gpio_wb_32b
-export PLATFORM=sky130hd
-export VERILOG_FILES=${IP_ROOT}/rtl/verilog/gpio_wb_32b.v
-export DIE_AREA = 0.0 0.0 171.12 204.00
-export CORE_AREA = 11.50 10.88 159.62 193.12
-export LEC_CHECK = 0
-export MAX_ROUTING_LAYER = met4
-export PLACE_DENSITY = 0.80
-export CORNERS = slow typ fast
-export SDC_FILE=${IP_ROOT}/${PDK}/constraints/sdc/gpio_x_x.sdc
-export PDN_TCL=${IP_ROOT}/${PDK}/constraints/pdn/gpio_x_32b.tcl
-export IO_CONSTRAINTS=${IP_ROOT}/${PDK}/constraints/io/gpio_wb_32b.tcl
-export TECH_LEF = $(PDK_ROOT)/${PDK}/libs.ref/sky130_fd_sc_hd/techlef/sky130_fd_sc_hd__nom.tlef
-export SC_LEF = $(PDK_ROOT)/${PDK}/libs.ref/sky130_fd_sc_hd/lef/sky130_fd_sc_hd.lef
-export TYP_LIB_FILES = $(PDK_ROOT)/${PDK}/libs.ref/sky130_fd_sc_hd/lib/sky130_fd_sc_hd__tt_025C_1v80.lib
-export SLOW_LIB_FILES = $(PDK_ROOT)/${PDK}/libs.ref/sky130_fd_sc_hd/lib/sky130_fd_sc_hd__ss_100C_1v60.lib
-export FAST_LIB_FILES = $(PDK_ROOT)/${PDK}/libs.ref/sky130_fd_sc_hd/lib/sky130_fd_sc_hd__ff_n40C_1v95.lib
-export TYP_LIB_FILES += $(ADDITIONAL_LIBS)
-export SLOW_LIB_FILES += $(ADDITIONAL_SLOW_LIBS)
-export FAST_LIB_FILES += $(ADDITIONAL_FAST_LIBS)
-export GDS_FILES = $(PDK_ROOT)/${PDK}/libs.ref/sky130_fd_sc_hd/gds/sky130_fd_sc_hd.gds
-export GDS_FILES += $(ADDITIONAL_GDS)
diff --git a/sources/digital/peripherals/io/gpio/sky130A/flow/orfs/gpio_wb_32b/rules-base.json b/sources/digital/peripherals/io/gpio/sky130A/flow/orfs/gpio_wb_32b/rules-base.json
deleted file mode 100644
index 907ffcb..0000000
--- a/sources/digital/peripherals/io/gpio/sky130A/flow/orfs/gpio_wb_32b/rules-base.json
+++ /dev/null
@@ -1,102 +0,0 @@
-{
- "synth__design__instance__area__stdcell": {
- "value": 20600.0,
- "compare": "<="
- },
- "constraints__clocks__count": {
- "value": 1,
- "compare": "=="
- },
- "placeopt__design__instance__area": {
- "value": 22664,
- "compare": "<="
- },
- "placeopt__design__instance__count__stdcell": {
- "value": 2376,
- "compare": "<="
- },
- "detailedplace__design__violations": {
- "value": 0,
- "compare": "=="
- },
- "cts__design__instance__count__setup_buffer": {
- "value": 207,
- "compare": "<="
- },
- "cts__design__instance__count__hold_buffer": {
- "value": 207,
- "compare": "<="
- },
- "cts__timing__setup__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "cts__timing__setup__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "cts__timing__hold__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "cts__timing__hold__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "globalroute__antenna_diodes_count": {
- "value": 100,
- "compare": "<="
- },
- "globalroute__timing__setup__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "globalroute__timing__setup__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "globalroute__timing__hold__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "globalroute__timing__hold__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "detailedroute__route__wirelength": {
- "value": 92590,
- "compare": "<="
- },
- "detailedroute__route__drc_errors": {
- "value": 0,
- "compare": "<="
- },
- "detailedroute__antenna__violating__nets": {
- "value": 0,
- "compare": "<="
- },
- "detailedroute__antenna_diodes_count": {
- "value": 100,
- "compare": "<="
- },
- "finish__timing__setup__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "finish__timing__setup__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "finish__timing__hold__ws": {
- "value": -1.0,
- "compare": ">="
- },
- "finish__timing__hold__tns": {
- "value": -4.0,
- "compare": ">="
- },
- "finish__design__instance__area": {
- "value": 24278,
- "compare": "<="
- }
-}
\ No newline at end of file