Repository navigation
Conversation
…xplicit ones that set to 'met2'. This saves on geometry and is DRC clean. GDS file changes: cell sky130 before → after transmission_gate 38,300 → 33,308 (−13%) low_voltage_cmirror 383,358 → 361,342 flipped_voltage_follower 97,250 → 92,642 current_mirror_nfet 62,046 → 59,102 nmos_narrow 35,286 → 33,622
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Branch:
met1-defaults→main· 3 commits · changes every cell's geometryTwo default flips in
primitives/fet.py, plus the cells that hardcoded the oldvalue:
nmos/pmos:tie_layers("met2","met1")→("met1","met1")(and the same in
fvf,current_mirror,transmission_gate,two_nfet_interdigitized,two_pfet_interdigitized)multiplier:inter_finger_topmet"met2"→"met1"The second is the larger one. Every source/drain region was being brought all the
way up to met2 whether or not it needed to reach a rail — the rails' own vias
already alternate (source rail lands on even S/D positions, drain rail on odd,
via
sdvia_extension = big_extension if finger % 2 else ...). The code alreadyknew better in one place: dummy devices are built with
inter_finger_topmet="met1"(fet.py:339).Measured
Identical commits, only the defaults differing:
Per cell on gf180:
transmission_gate−30.8% metal and 58 → 6 vias, both currentmirrors −24.0%,
flipped_voltage_follower−22.3%,low_voltage_cmirror−21.5%with 486 → 102 vias,
opamp−16.7% and 4076 → 2198 vias.Verification
Full DRC + LVS, both PDKs, on this branch off
main:opampLVS failures thatmainalready has:gf180's MIM-option bug (fixed by the LVS-harness PR) and sky130's Magic
PMOS-bulk mis-extraction. Both verified pre-existing by reverting and re-running.
The two placement helpers that consume the inter-finger top-metal ports were
checked explicitly, since they are the only code that touches them:
two_transistor_interdigitizedstill passes DRC on both PDKs, andcommon_centroid_ab_ba's gf180 DRC result is bit-identical before and after(same 4 M2.2a in the same places — that is the separate bug fixed in the
placement-helper PR, neither caused nor fixed by this change).
Their routing turned out to be layer-agnostic:
two_transistor_interdigitizedderives its route layer from the port itself
(
pdk.layer_to_glayer(...ports["row0_col0_rightsd_top_met_N"].layer)), andcommon_centroid_ab_batakesglayer1from the drain rail, not theinter-finger array.
Reviewer notes
LVS-harness and placement-helper PRs so the baseline is green first.
macro_two_transistor_interdigitized(independent of the defaults; happy to split it out if preferred).
inter_finger_topmetis still a parameter — pass"met2"for a layout thatneeds the old stack.
🤖 Generated with Claude Code
https://claude.ai/code/session_01RExJUxLyBEHcQRb6GprVSL