mirror of https://github.com/VLSIDA/OpenRAM.git
Fix well offset computation for PMOS
This commit is contained in:
parent
400cf0333a
commit
34c9b3a0a5
|
|
@ -155,16 +155,18 @@ class ptx(design.design):
|
||||||
# Poly height must include poly extension over active
|
# Poly height must include poly extension over active
|
||||||
self.poly_height = self.tx_width + 2 * self.poly_extend_active
|
self.poly_height = self.tx_width + 2 * self.poly_extend_active
|
||||||
|
|
||||||
well_name = "{}well".format(self.well_type)
|
|
||||||
|
|
||||||
# The active offset is due to the well extension
|
# The active offset is due to the well extension
|
||||||
if well_name in layer:
|
# but we need to do the active offset for the other tx type too
|
||||||
well_enclose_active = drc(well_name + "_enclose_active")
|
# so that they align in pgates.
|
||||||
self.active_offset = vector([well_enclose_active] * 2)
|
well_enclose_active = 0
|
||||||
else:
|
if self.well_type=="p" and "pwell" in layer:
|
||||||
self.active_offset = vector(0, 0)
|
well_enclose_active = max(drc("pwell_enclose_active"), well_enclose_active)
|
||||||
|
if self.well_type=="n" and "nwell" in layer:
|
||||||
|
well_enclose_active = max(drc("nwell_enclose_active"), well_enclose_active)
|
||||||
|
self.active_offset = vector([well_enclose_active] * 2)
|
||||||
|
|
||||||
# Well enclosure of active, ensure minwidth as well
|
# Well enclosure of active, ensure minwidth as well
|
||||||
|
well_name = "{}well".format(self.well_type)
|
||||||
if well_name in layer:
|
if well_name in layer:
|
||||||
well_width_rule = drc("minwidth_" + well_name)
|
well_width_rule = drc("minwidth_" + well_name)
|
||||||
well_enclose_active = drc(well_name + "_enclose_active")
|
well_enclose_active = drc(well_name + "_enclose_active")
|
||||||
|
|
@ -334,13 +336,10 @@ class ptx(design.design):
|
||||||
if not (well_name in layer or "vtg" in layer):
|
if not (well_name in layer or "vtg" in layer):
|
||||||
return
|
return
|
||||||
|
|
||||||
center_pos = self.active_offset + vector(self.width / 2.0,
|
center_pos = self.active_offset + vector(0.5*self.active_width,
|
||||||
self.height / 2.0)
|
0.5*self.active_height)
|
||||||
well_ll = center_pos - vector(self.well_width / 2.0,
|
well_ll = center_pos - vector(0.5*self.well_width,
|
||||||
self.well_height / 2.0)
|
0.5*self.well_height)
|
||||||
well_ll = well_ll - vector(0,
|
|
||||||
self.poly_extend_active)
|
|
||||||
|
|
||||||
if well_name in layer:
|
if well_name in layer:
|
||||||
self.add_rect(layer=well_name,
|
self.add_rect(layer=well_name,
|
||||||
offset=well_ll,
|
offset=well_ll,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue