Better centering of pinv_dec

This commit is contained in:
mrg 2020-06-14 14:09:45 -07:00
parent 8f1dc7eeea
commit 91f20f2cf6
1 changed files with 9 additions and 10 deletions

View File

@ -8,7 +8,7 @@
import contact import contact
import pinv import pinv
import debug import debug
from tech import drc, parameter from tech import drc, parameter, layer
from vector import vector from vector import vector
from globals import OPTS from globals import OPTS
from sram_factory import factory from sram_factory import factory
@ -102,31 +102,30 @@ class pinv_dec(pinv.pinv):
def extend_wells(self): def extend_wells(self):
""" Extend bottom to top for each well. """ """ Extend bottom to top for each well. """
from tech import layer
if "pwell" in layer: if "pwell" in layer:
ll = self.nmos_inst.ll() - self.nmos_inst.mod.active_offset ll = (self.nmos_inst.ll() - vector(2 * [self.well_enclose_active])).scale(1, 0)
ur = self.nmos_inst.ur() + self.nmos_inst.mod.active_offset ur = self.nmos_inst.ur() + vector(2 * [self.well_enclose_active])
self.add_rect(layer="pwell", self.add_rect(layer="pwell",
offset=ll, offset=ll,
width=ur.x - ll.x, width=ur.x - ll.x,
height=self.height - ll.y + 0.5 * self.pwell_contact.height + self.well_enclose_active) height=self.height - ll.y + 0.5 * self.pwell_contact.height + self.well_enclose_active)
if "nwell" in layer: if "nwell" in layer:
ll = self.pmos_inst.ll() - self.pmos_inst.mod.active_offset ll = (self.pmos_inst.ll() - vector(2 * [self.well_enclose_active])).scale(1, 0)
ur = self.pmos_inst.ur() + self.pmos_inst.mod.active_offset ur = self.pmos_inst.ur() + vector(2 * [self.well_enclose_active])
self.add_rect(layer="nwell", self.add_rect(layer="nwell",
offset=ll, offset=ll,
width=ur.x - ll.x, width=ur.x - ll.x,
height=self.height - ll.y + 0.5 * self.nwell_contact.height + self.well_enclose_active) height=self.height - ll.y + 0.5 * self.nwell_contact.height + self.well_enclose_active)
def place_ptx(self): def place_ptx(self):
""" """
""" """
# center the transistors in the y-dimension (it is rotated, so use the width)
y_offset = 0.5 * (self.height - self.nmos.width) + self.nmos.width
# offset so that the input contact is over from the left edge by poly spacing # offset so that the input contact is over from the left edge by poly spacing
x_offset = self.nmos.active_offset.y + contact.poly_contact.width + self.poly_space x_offset = self.nmos.active_offset.y + contact.poly_contact.width + self.poly_space
# bottom of the transistor in the y-dimension
y_offset = self.nmos.width + self.active_space
self.nmos_pos = vector(x_offset, y_offset) self.nmos_pos = vector(x_offset, y_offset)
self.nmos_inst.place(self.nmos_pos, self.nmos_inst.place(self.nmos_pos,
rotate=270) rotate=270)
@ -206,7 +205,7 @@ class pinv_dec(pinv.pinv):
self.add_via_stack_center(offset=contact_pos, self.add_via_stack_center(offset=contact_pos,
from_layer=self.active_stack[2], from_layer=self.active_stack[2],
to_layer=self.supply_layer) to_layer=self.supply_layer)
def route_supply_rails(self): def route_supply_rails(self):
pin = self.nmos_inst.get_pin("S") pin = self.nmos_inst.get_pin("S")
source_pos = pin.center() source_pos = pin.center()