From 098219d56c9bf8127ba45dc69739f7ebc494595c Mon Sep 17 00:00:00 2001 From: mrg Date: Thu, 11 Jun 2020 11:53:59 -0700 Subject: [PATCH] Add npc enclosure to poly contacts --- compiler/base/contact.py | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/compiler/base/contact.py b/compiler/base/contact.py index 14dbf76e..cc1ca27a 100644 --- a/compiler/base/contact.py +++ b/compiler/base/contact.py @@ -7,7 +7,7 @@ # import hierarchy_design import debug -from tech import drc +from tech import drc, layer import tech from vector import vector from sram_factory import factory @@ -44,7 +44,8 @@ class contact(hierarchy_design.hierarchy_design): self.add_comment("well_type: {}\n".format(well_type)) self.is_well_contact = implant_type == well_type - + + # If we have a special tap layer, use it self.layer_stack = layer_stack self.dimensions = dimensions @@ -196,17 +197,19 @@ class contact(hierarchy_design.hierarchy_design): if "npc" not in tech.layer: return + npc_enclose_poly = drc("npc_enclose_poly") + npc_enclose_offset = vector(npc_enclose_poly, npc_enclose_poly) # Only add for poly layers if self.first_layer_name == "poly": self.add_rect(layer="npc", - offset=self.first_layer_position, - width=self.first_layer_width, - height=self.first_layer_height) + offset=self.first_layer_position - npc_enclose_offset, + width=self.first_layer_width + 2 * npc_enclose_poly, + height=self.first_layer_height + 2 * npc_enclose_poly) elif self.second_layer_name == "poly": self.add_rect(layer="npc", - offset=self.second_layer_position, - width=self.second_layer_width, - height=self.second_layer_height) + offset=self.second_layer_position - npc_enclose_offset, + width=self.second_layer_width + 2 * npc_enclose_poly, + height=self.second_layer_height + 2 * npc_enclose_poly) def create_first_layer_enclosure(self): # this is if the first and second layers are different @@ -218,7 +221,11 @@ class contact(hierarchy_design.hierarchy_design): self.first_layer_minwidth) self.first_layer_height = max(self.contact_array_height + 2 * self.first_layer_vertical_enclosure, self.first_layer_minwidth) - self.add_rect(layer=self.first_layer_name, + if self.is_well_contact and self.first_layer_name == "active" and "tap" in layer: + first_layer_name = "tap" + else: + first_layer_name = self.first_layer_name + self.add_rect(layer=first_layer_name, offset=self.first_layer_position, width=self.first_layer_width, height=self.first_layer_height)