Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 53 additions & 2 deletions src/glayout/pdk/gf180_mapped/gf180_grules.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
from ..mappedpdk import MappedPDK

grulesobj = dict()
for glayer in MappedPDK.valid_glayers:
grulesobj[glayer] = dict((x, None) for x in MappedPDK.valid_glayers)
# Add sab and res_mk to valid_glayers for polyresistor support
extended_glayers = list(MappedPDK.valid_glayers) + ["sab", "res_mk"]
for glayer in extended_glayers:
grulesobj[glayer] = dict((x, None) for x in extended_glayers)

grulesobj["dnwell"]["dnwell"] = {'min_width': 1.7, 'min_separation': 5.42}
grulesobj["dnwell"]["pwell"] = {'min_enclosure': 2.5}
Expand Down Expand Up @@ -366,3 +368,52 @@
grulesobj["capmet"]["met5"] = {}
grulesobj["capmet"]["capmet"] = {'capmettop': (42, 0), 'capmetbottom': (36, 0), 'min_separation': 1.2}

# Initialize sab and res_mk grules
grulesobj["sab"]["sab"] = {'min_width': 0.28, 'min_separation': 0.28}
grulesobj["sab"]["dnwell"] = {}
grulesobj["sab"]["pwell"] = {}
grulesobj["sab"]["nwell"] = {}
grulesobj["sab"]["p+s/d"] = {}
grulesobj["sab"]["n+s/d"] = {}
grulesobj["sab"]["active_diff"] = {}
grulesobj["sab"]["active_tap"] = {}
grulesobj["sab"]["poly"] = {"min_enclosure": 0.28}
grulesobj["sab"]["mcon"] = {"min_separation": 0.22}
grulesobj["sab"]["met1"] = {}
grulesobj["sab"]["via1"] = {}
grulesobj["sab"]["met2"] = {}
grulesobj["sab"]["via2"] = {}
grulesobj["sab"]["met3"] = {}
grulesobj["sab"]["via3"] = {}
grulesobj["sab"]["met4"] = {}
grulesobj["sab"]["via4"] = {}
grulesobj["sab"]["met5"] = {}
grulesobj["sab"]["capmet"] = {}

grulesobj["res_mk"]["res_mk"] = {"min_width": 0.4, "min_separation": 20.0}
grulesobj["res_mk"]["dnwell"] = {}
grulesobj["res_mk"]["pwell"] = {}
grulesobj["res_mk"]["nwell"] = {}
grulesobj["res_mk"]["p+s/d"] = {}
grulesobj["res_mk"]["n+s/d"] = {}
grulesobj["res_mk"]["active_diff"] = {"min_separation": 0.3}
grulesobj["res_mk"]["active_tap"] = {}
grulesobj["res_mk"]["poly"] = {"min_enclosure": 0.4, "min_separation": 0.3}
grulesobj["res_mk"]["mcon"] = {}
grulesobj["res_mk"]["met1"] = {}
grulesobj["res_mk"]["via1"] = {}
grulesobj["res_mk"]["met2"] = {}
grulesobj["res_mk"]["via2"] = {}
grulesobj["res_mk"]["met3"] = {}
grulesobj["res_mk"]["via3"] = {}
grulesobj["res_mk"]["met4"] = {}
grulesobj["res_mk"]["via4"] = {}
grulesobj["res_mk"]["met5"] = {}
grulesobj["res_mk"]["capmet"] = {}
grulesobj["res_mk"]["sab"] = {}

# Update existing rules for polyresistor compatibility
grulesobj["p+s/d"]["poly"] = {"min_enclosure": 0.3}
grulesobj["p+s/d"]["mcon"] = {"min_enclosure": 0.2}
grulesobj["poly"]["active_diff"] = {"min_separation": 0.6}
grulesobj["poly"]["poly"] = {"min_width": 1, "min_separation": 0.4}
11 changes: 10 additions & 1 deletion src/glayout/pdk/gf180_mapped/gf180_mapped.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@
"lvpwell": (204, 0),
"dnwell": (12, 0),
"CAP_MK": (117, 5),
"RES_MK": (110, 5),
"SAB": (49, 0),
# BJT layers
"drc_bjt": (127, 5),
"lvs_bjt": (118, 5),
Expand Down Expand Up @@ -63,6 +65,8 @@
"pwell": "lvpwell",
"dnwell": "dnwell",
"capmet": "CAP_MK",
"res_mk": "RES_MK",
"sab": "SAB",
# bjt layer
"drc_bjt": "drc_bjt",
"lvs_bjt": "lvs_bjt",
Expand Down Expand Up @@ -131,7 +135,12 @@
models={
'nfet': 'nfet_03v3',
'pfet': 'pfet_03v3',
'mimcap': 'mimcap_1p0fF'
'mimcap': 'mimcap_1p0fF',
'ppolyf_s': 'ppolyf_s',
'ppolyf_u': 'ppolyf_u',
'npolyf_s': 'npolyf_s',
'npolyf_u': 'npolyf_u',
"ppolyf_u_1k": "ppolyf_u_1k"
},
layers=LAYER,
pdk_files=pdk_files,
Expand Down
9 changes: 6 additions & 3 deletions src/glayout/pdk/mappedpdk.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
"""
import re
from gdsfactory.pdk import Pdk
from gdsfactory.typings import Component, PathType, Layer
from gdsfactory import Component
from gdsfactory.typings import PathType, Layer
from pydantic import validator, StrictStr, ValidationError
from typing import ClassVar, Optional, Any, Union, Literal, Iterable, TypedDict
from pathlib import Path
Expand Down Expand Up @@ -259,6 +260,8 @@ class MappedPDK(Pdk):
"via4",
"met5",
"capmet",
"sab",
"res_mk",
"lvs_bjt",
"drc_bjt",
# _pin layers
Expand Down Expand Up @@ -299,8 +302,8 @@ class MappedPDK(Pdk):
@validator("models")
def models_check(cls, models_obj: dict[StrictStr, StrictStr]):
for model in models_obj.keys():
if not model in ["nfet","pfet","mimcap"]:
raise ValueError(f"specify nfet, pfet, or mimcap models only")
if not model in ["nfet","pfet","mimcap","ppolyf_s","ppolyf_u","npolyf_s","npolyf_u","ppolyf_u_1k"]:
raise ValueError(f"specify nfet, pfet, mimcap, or polyresistor models only")
return models_obj

@validator("glayers")
Expand Down
Loading