journal 2026-05-02

P36 clears the last fanout count

p36rv32imhardensignoff

P36 already did the architectural job: move the signed divide/remainder final correction into S_DIV_SIGN, keep the ACT4/Sail I/M batches green, and clear the P35 slew/cap tail. The remaining annoyance was purely backend-shaped: RUN_2026-05-01_20-53-59 still had one max-fanout violation, a 14-load branch against the same fanout-13 signoff target P35 used.

The cleanup was to make place-and-route work a little harder than signoff. The main p36.sdc still defines the clock, IO delays, output loads, and electrical limits, but MAX_FANOUT_CONSTRAINT is now 12 during PnR. Post-PnR STA reads p36_signoff.sdc, which keeps the accepted signoff fanout limit at 13.

That produced a clean harden:

checkresult
LibreLane flowPASS
ACT4/Sail rv32i/IPASS=39 FAIL=0 NOT RUN=0
ACT4/Sail rv32i/MPASS=8 FAIL=0 NOT RUN=0
Full RISC-V complianceNOT RUN
Run directoryprojects/36_rv32im_divider_sign_stage/librelane/runs/RUN_2026-05-02_21-18-57
Final GDSprojects/36_rv32im_divider_sign_stage/librelane/runs/RUN_2026-05-02_21-18-57/final/gds/top.gds
Metricsprojects/36_rv32im_divider_sign_stage/librelane/runs/RUN_2026-05-02_21-18-57/final/metrics.json
Magic DRCPASS (0 errors)
KLayout DRCPASS (0 errors)
LVSPASS (0 errors)
AntennaPASS (0 net violations, 0 pin violations)
Route DRCPASS (0 errors)
Setup timingPASS (0 violations, worst setup slack 5.903 ns)
Hold timingPASS (0 violations, worst hold slack 0.070 ns)
Max slewPASS (0 violations)
Max capPASS (0 violations)
Max fanoutPASS (0 violations against signoff limit 13)

The standard-cell count is 27223, with 191659 um^2 of standard-cell area. That is a little larger and slower than P35, but this is the clean RV32IM endpoint we wanted before moving to the next rung.