Port an existing HighTide2 design from one technology platform to another (e.g., asap7 to nangate45 or sky130hd). Use when a design exists for one platform and needs to be added to another.
You are porting the design $0 from $1 to $2.
Before starting, verify:
designs/$1/$0/ with a working config.mk and BUILD.bazeldesigns/src/$0/ (shared across platforms)Read the source platform's configuration to understand:
designs/$1/$0/config.mk — all ORFS parametersdesigns/$1/$0/BUILD.bazel — Bazel flow configurationdesigns/$1/$0/constraint.sdc — clock period and port namesAlso study existing designs on the target platform to understand conventions:
designs/$2/*/config.mk and BUILD.bazel filesCompare designs that already exist on both platforms to determine scaling factors. Read the constraint.sdc and config.mk for each shared design on both $1 and $2.
Clock period scaling: For each design on both platforms, compute the ratio target_period / source_period. Average these ratios to get a clock scaling factor. Be mindful of unit differences (asap7 uses picoseconds, nangate45/sky130hd use nanoseconds).
Area scaling: For designs using explicit DIE_AREA/CORE_AREA, compute the ratio of die areas between platforms. For designs using CORE_UTILIZATION, note that utilization percentages are generally kept similar across platforms.
Apply these empirically-derived ratios when creating the new design's SDC and floorplan parameters.
| Parameter | asap7 (7nm) | nangate45 (45nm) | sky130hd (130nm) |
|---|---|---|---|
| Clock period units | picoseconds | nanoseconds | nanoseconds |
| Nominal voltage | 0.7V | 1.1V | 1.8V |
| Metal layer names | M1-M9 | metal1-metal10 | met1-met5 |
| FakeRAM pin layer | M4 | metal3 | met3 |
| FakeRAM OBS layers | M1, M2, M3 | metal1-metal4 | met1-met3 |
| Site snap (w x h) | 0.054 x 0.270 | 0.190 x 1.400 | 0.460 x 2.720 |
| Pin width | 0.024 | 0.140 | 0.170 |
| Pin pitch | 0.144 | 1.400 | 2.720 |
| Area per bit (FakeRAM) | 0.5 | 3.8 | 10.0 |
mkdir -p designs/$2/$0
For multi-variant designs, mirror the source directory structure.
Scale the clock period using the ratio derived in step 2. Keep the same clock name, port name, and IO percentage.
Use the standard SDC template matching the target platform's conventions (ns-based periods, [expr $clk_period * $clk_io_pct] for IO delays).
Important: asap7 SDC files sometimes use fixed input/output delays (e.g., set_input_delay 10). For other platforms, use the [expr $clk_period * $clk_io_pct] pattern instead.
Copy the source config.mk and modify:
PLATFORM to $2DESIGN_NAME and synthesis parameters (SYNTH_HIERARCHICAL, ABC_AREA, TNS_END_PERCENT)CORE_UTILIZATION down for larger technology nodes. Designs with high routing demand (wide combinational datapaths like sha3) may need significantly lower utilization on nangate45/sky130hd than on asap7 because the routing resources per unit area are different. Calibrate using existing cross-platform designs. As a rule of thumb, reduce utilization by ~30-35% from asap7 to nangate45 (e.g., 70% → 45%).PLACE_DENSITY_LB_ADDON over fixed PLACE_DENSITY — it adapts better to different die sizesDIE_AREA/CORE_AREA (explicit dimensions), scale them using the area ratio from step 2, or switch to CORE_UTILIZATION to let ORFS auto-sizeADDITIONAL_LEFS/ADDITIONAL_LIBS paths to point to $2 platform directoryMACRO_PLACE_HALO proportionally to technology node (e.g., if asap7 uses 6 6, nangate45 might use 40 40 based on the ratio seen in existing designs)Follow the pattern from existing designs on the target platform. Key changes:
platform = "$2"//designs/src/$0:rtl)For designs with memories, create a parent BUILD.bazel with filegroups:
package(default_visibility = ["//designs/$2/$0:__subpackages__"])
filegroup(name = "sram_lefs", srcs = glob(["sram/lef/*.lef"]))
filegroup(name = "sram_libs", srcs = glob(["sram/lib/*.lib"]))
Bazel PDK availability: Not all platforms have Bazel PDK targets defined in bazel-orfs. The PDK list is in docker.BUILD.bazel within the bazel-orfs repo. If the target platform is not in that list, the Bazel flow will fail with "no such target" for the platform's config.mk. To add a new platform to the Bazel flow:
docker.BUILD.bazel for the current PDK listfor pdk in [...] loop in docker.BUILD.bazel upstream in bazel-orfsDesigns with embedded memories need platform-specific FakeRAM LEF and LIB files. The FakeRAM LEF/LIB are placeholder black boxes — exact timing is not critical. What matters is:
Check if the design already has a FakeRAM generator script in designs/src/$0/dev/. If so, check whether it supports a --platform flag for the target platform. If not, either extend it or create a new generator.
The generator should use the platform-specific constants from the table in step 3 (metal layer names, pin dimensions, voltage, area scaling). See designs/src/bp_processor/dev/gen_fakeram.py for an example of a platform-aware generator with a PLATFORM_PARAMS dict.
Place generated files at:
designs/$2/$0/sram/lef/fakeram_*.lef
designs/$2/$0/sram/lib/fakeram_*.lib
If the design uses a macros.v wrapper, generate or copy that too — the Verilog content is platform-independent (same FakeRAM module names).
If the source design has a custom pdn.tcl, the ported design will likely need one too — the same design characteristics (macro density, power distribution needs) that motivated a custom PDN on the source platform apply on the target.
Port the pdn.tcl by:
Without a ported pdn.tcl, the design will likely have IR drop issues in the final analysis.
If the source design has a custom io.tcl, the ported design will likely need one too — the same pin count and routing congestion concerns apply regardless of technology.
Port the io.tcl by:
If coordinate scaling is impractical (e.g., the source uses procedural placement with many hardcoded values), consider rewriting the io.tcl using set_io_pin_constraint with region-based placement instead of exact coordinates.
# Bazel flow
bazel build //designs/$2/$0:$0_synth # Test synthesis first
bazel build //designs/$2/$0:$0_final # Full flow
# Make flow
make DESIGN_CONFIG=./designs/$2/$0/config.mk
If synthesis fails, check:
If placement/routing fails, try:
CORE_UTILIZATION (e.g., from 49 to 40)MACRO_PLACE_HALOPLACE_DENSITY_LB_ADDONAfter a successful build, check:
reports/$2/$0/*/ for QoR reports