From 3074cf3b86c150189541416558997029cb2261d4 Mon Sep 17 00:00:00 2001 From: mrg Date: Wed, 1 Apr 2020 11:15:29 -0700 Subject: [PATCH] Small format cleanup --- compiler/bitcells/pbitcell.py | 70 ++++++++++++++++++----------------- compiler/pgates/ptx.py | 12 +++--- 2 files changed, 43 insertions(+), 39 deletions(-) diff --git a/compiler/bitcells/pbitcell.py b/compiler/bitcells/pbitcell.py index 61bd9710..be96a129 100644 --- a/compiler/bitcells/pbitcell.py +++ b/compiler/bitcells/pbitcell.py @@ -7,7 +7,7 @@ # import contact import debug -from tech import drc, parameter +from tech import drc, parameter, layer from vector import vector from ptx import ptx from globals import OPTS @@ -975,42 +975,44 @@ class pbitcell(bitcell_base.bitcell_base): """ Connects wells between ptx modules and places well contacts """ - # extend pwell to encompass entire nmos region of the cell up to the - # height of the tallest nmos transistor - max_nmos_well_height = max(self.inverter_nmos.well_height, - self.readwrite_nmos.well_height, - self.write_nmos.well_height, - self.read_nmos.well_height) - well_height = max_nmos_well_height + self.port_ypos \ - - self.nwell_enclose_active - self.gnd_position.y - # FIXME fudge factor xpos - well_width = self.width + 2*self.nwell_enclose_active - offset = vector(self.leftmost_xpos - self.nwell_enclose_active, self.botmost_ypos) - self.add_rect(layer="pwell", - offset=offset, - width=well_width, - height=well_height) - + if "pwell" in layer: + # extend pwell to encompass entire nmos region of the cell up to the + # height of the tallest nmos transistor + max_nmos_well_height = max(self.inverter_nmos.well_height, + self.readwrite_nmos.well_height, + self.write_nmos.well_height, + self.read_nmos.well_height) + well_height = max_nmos_well_height + self.port_ypos \ + - self.nwell_enclose_active - self.gnd_position.y + # FIXME fudge factor xpos + well_width = self.width + 2*self.nwell_enclose_active + offset = vector(self.leftmost_xpos - self.nwell_enclose_active, self.botmost_ypos) + self.add_rect(layer="pwell", + offset=offset, + width=well_width, + height=well_height) + # extend nwell to encompass inverter_pmos # calculate offset of the left pmos well - inverter_well_xpos = -(self.inverter_nmos.active_width + 0.5 * self.inverter_to_inverter_spacing) \ - - self.nwell_enclose_active - inverter_well_ypos = self.inverter_nmos_ypos + self.inverter_nmos.active_height \ - + self.inverter_gap - self.nwell_enclose_active + if "nwell" in layer: + inverter_well_xpos = -(self.inverter_nmos.active_width + 0.5 * self.inverter_to_inverter_spacing) \ + - self.nwell_enclose_active + inverter_well_ypos = self.inverter_nmos_ypos + self.inverter_nmos.active_height \ + + self.inverter_gap - self.nwell_enclose_active + + # calculate width of the two combined nwells + # calculate height to encompass nimplant connected to vdd + well_width = 2 * (self.inverter_nmos.active_width + 0.5 * self.inverter_to_inverter_spacing) \ + + 2 * self.nwell_enclose_active + well_height = self.vdd_position.y - inverter_well_ypos \ + + self.nwell_enclose_active + drc["minwidth_tx"] - # calculate width of the two combined nwells - # calculate height to encompass nimplant connected to vdd - well_width = 2 * (self.inverter_nmos.active_width + 0.5 * self.inverter_to_inverter_spacing) \ - + 2 * self.nwell_enclose_active - well_height = self.vdd_position.y - inverter_well_ypos \ - + self.nwell_enclose_active + drc["minwidth_tx"] - - # FIXME fudge factor xpos - offset = [inverter_well_xpos + 2*self.nwell_enclose_active, inverter_well_ypos] - self.add_rect(layer="nwell", - offset=offset, - width=well_width, - height=well_height) + # FIXME fudge factor xpos + offset = [inverter_well_xpos + 2*self.nwell_enclose_active, inverter_well_ypos] + self.add_rect(layer="nwell", + offset=offset, + width=well_width, + height=well_height) # add well contacts # connect pimplants to gnd diff --git a/compiler/pgates/ptx.py b/compiler/pgates/ptx.py index 8fbb94d8..b9d04f32 100644 --- a/compiler/pgates/ptx.py +++ b/compiler/pgates/ptx.py @@ -196,6 +196,8 @@ class ptx(design.design): # The well is not included in the height and width self.height = self.poly_height self.width = self.active_width + self.well_height = self.height + self.well_width = self.width # This is the center of the first active contact offset (centered vertically) self.contact_offset = self.active_offset + vector(0.5 * self.active_contact.width, @@ -353,10 +355,10 @@ class ptx(design.design): if not (well_name in layer or "vtg" in layer): return - center_pos = self.active_offset + vector(0.5*self.active_width, - 0.5*self.active_height) - well_ll = center_pos - vector(0.5*self.well_width, - 0.5*self.well_height) + center_pos = self.active_offset + vector(0.5 * self.active_width, + 0.5 * self.active_height) + well_ll = center_pos - vector(0.5 * self.well_width, + 0.5 * self.well_height) if well_name in layer: self.add_rect(layer=well_name, offset=well_ll, @@ -450,7 +452,7 @@ class ptx(design.design): contact=self.add_via_center(layers=self.active_stack, offset=pos, size=(1, self.num_contacts), - directions=("V","V"), + directions=("V", "V"), implant_type=self.implant_type, well_type=self.well_type)