Hard macros and IHP SG13G2 bring-up¶
The physical importer accepts CLASS BLOCK cells with a fixed placement in the
floorplan's macro_placements map. Their dimensions and pins come from the
original LEF, independently of the standard-cell site. Fixed cells retain their
position, orientation and optional halo during placement and CTS, and are
exported as FIXED DEF components. Row placement subtracts their halos under
an explicit work limit. Row-rail preparation, taps and fillers use the same segmented rows. Macro-free
vertical channels carry additional supply spines; at least one full-width row
bridge is required to connect them to the primary grid.
A grouped Verilog port needs the original declaration range in
pin_buses[master][port], for example [31, 0]. The importer validates that every
bit has a unique scalar LEF pin; it preserves ordering through linking, constant
fanout repair and Verilog export. This does not infer a macro's functionality or
lower its storage into standard cells.
rail_via_stack optionally lists original fixed vias from the rail layer to a
higher strap layer. Intermediate landings meet the via enclosure and LEF area
requirements. The final strap can therefore be above standard-cell internal
metal. Empty lists retain the single-via configuration.
macro_supply in the physical configuration selects the pin layer, collection
layer, original fixed via and a contiguous via stack from the standard-cell
supply spine. Connections use enclosed access shapes from the macro's real PG
pins. The generator does not replace a macro with a site-height placeholder or
waive missing PG access. TapConfig.body_view = "gds" records that the original
GDS contains the contacts omitted from an abstract LEF; independent extraction
and LVS remain required before claiming body-bias connectivity.
The stored LEF obstruction rectangles remain unchanged. Per-layer OBS SPACING
values are retained separately. The routing view uses the larger of its explicit
layer policy and the OBS spacing, adding only the difference to its obstacle
view. This is conservative when the layer policy exceeds the OBS override and
avoids counting the spacing twice. The LEF/DEF 5.8 language reference describes
SPACING as an override, rather than extra physical metal (page 134).
ClockConfig.root_net optionally selects an existing internal clock net for a
buffer tree. The primary port still identifies the clock in the CTS constraints.
The internal root must have one driver; its original gate remains connected and
the inserted buffers are driven from that net. The route clock scope includes
both the primary clock and internal root. This is a single selected tree, not
a clock-forest or timing-closure claim. The full design SDC remains necessary for
STA even when a clock-only projection is supplied to the narrow CTS parser.
For the IHP comparison, build_rc_profile.py --pdk ihp --resistance-model
openrcx-pdk binds wire resistance to the original constant RESOVER table and
cut resistance to the original technology LEF. The nominal SPEF is shared by
TT and SS Liberty analyses. The default Magic resistance model remains an
independent cross-check, and existing SKY130/GF180 profiles remain unchanged.
Extraction omits CLASS BLOCK LEF OBS, which describes routing exclusion
rather than a grounded conductor. Declared macro pin and supply shapes remain
in the extraction view, and routing still respects every original obstruction.
Independent OpenRCX controls compare absent, empty and obstructed macros with
a real grounded routing-wire positive control. The extraction report states
this geometry scope explicitly.
The active Ibex campaign is under the superproject's
.work/ibex-sg13g2-repair/road-agent/. Its checks include fixed-macro preservation,
real SRAM bus connectivity, original-vendor-model simulation after CTS, and
independent physical checks. No full routed DRC/LVS/extracted-timing pass is
established by these APIs or by the unit tests.