mirror of https://github.com/VLSIDA/OpenRAM.git
Separate active and poly contact to gate rule
This commit is contained in:
parent
a32b5b13e8
commit
cddb16dabc
|
|
@ -205,7 +205,8 @@ class design(hierarchy_design):
|
||||||
print("poly_to_active", self.poly_to_active)
|
print("poly_to_active", self.poly_to_active)
|
||||||
print("poly_extend_active", self.poly_extend_active)
|
print("poly_extend_active", self.poly_extend_active)
|
||||||
print("poly_to_contact", self.poly_to_contact)
|
print("poly_to_contact", self.poly_to_contact)
|
||||||
print("contact_to_gate", self.contact_to_gate)
|
print("active_contact_to_gate", self.active_contact_to_gate)
|
||||||
|
print("poly_contact_to_gate", self.poly_contact_to_gate)
|
||||||
print("well_enclose_active", self.well_enclose_active)
|
print("well_enclose_active", self.well_enclose_active)
|
||||||
print("implant_enclose_active", self.implant_enclose_active)
|
print("implant_enclose_active", self.implant_enclose_active)
|
||||||
print("implant_space", self.implant_space)
|
print("implant_space", self.implant_space)
|
||||||
|
|
|
||||||
|
|
@ -184,7 +184,7 @@ class pnand2(pgate.pgate):
|
||||||
# doesn't use nmos uy because that is calculated using offset + poly height
|
# doesn't use nmos uy because that is calculated using offset + poly height
|
||||||
active_top = self.nmos1_inst.by() + self.nmos1_inst.mod.active_height
|
active_top = self.nmos1_inst.by() + self.nmos1_inst.mod.active_height
|
||||||
active_to_poly_contact = active_top + self.poly_to_active + 0.5 * contact.poly_contact.first_layer_height
|
active_to_poly_contact = active_top + self.poly_to_active + 0.5 * contact.poly_contact.first_layer_height
|
||||||
active_to_poly_contact2 = active_top + drc("contact_to_gate") + 0.5 * self.route_layer_width
|
active_to_poly_contact2 = active_top + self.poly_contact_to_gate + 0.5 * self.route_layer_width
|
||||||
self.inputA_yoffset = max(active_contact_to_poly_contact,
|
self.inputA_yoffset = max(active_contact_to_poly_contact,
|
||||||
active_to_poly_contact,
|
active_to_poly_contact,
|
||||||
active_to_poly_contact2)
|
active_to_poly_contact2)
|
||||||
|
|
@ -200,7 +200,7 @@ class pnand2(pgate.pgate):
|
||||||
# active_contact_to_poly_contact = self.output_yoffset - self.route_layer_space - 0.5 * contact.poly_contact.second_layer_height
|
# active_contact_to_poly_contact = self.output_yoffset - self.route_layer_space - 0.5 * contact.poly_contact.second_layer_height
|
||||||
# active_bottom = self.pmos1_inst.by()
|
# active_bottom = self.pmos1_inst.by()
|
||||||
# active_to_poly_contact = active_bottom - self.poly_to_active - 0.5 * contact.poly_contact.first_layer_height
|
# active_to_poly_contact = active_bottom - self.poly_to_active - 0.5 * contact.poly_contact.first_layer_height
|
||||||
# active_to_poly_contact2 = active_bottom - drc("contact_to_gate") - 0.5 * self.route_layer_width
|
# active_to_poly_contact2 = active_bottom - self.poly_contact_to_gate - 0.5 * self.route_layer_width
|
||||||
# self.inputB_yoffset = min(active_contact_to_poly_contact,
|
# self.inputB_yoffset = min(active_contact_to_poly_contact,
|
||||||
# active_to_poly_contact,
|
# active_to_poly_contact,
|
||||||
# active_to_poly_contact2)
|
# active_to_poly_contact2)
|
||||||
|
|
|
||||||
|
|
@ -222,7 +222,7 @@ class pnand3(pgate.pgate):
|
||||||
# doesn't use nmos uy because that is calculated using offset + poly height
|
# doesn't use nmos uy because that is calculated using offset + poly height
|
||||||
active_top = self.nmos1_inst.by() + self.nmos1_inst.mod.active_height
|
active_top = self.nmos1_inst.by() + self.nmos1_inst.mod.active_height
|
||||||
active_to_poly_contact = active_top + self.poly_to_active + 0.5 * contact.poly_contact.first_layer_height
|
active_to_poly_contact = active_top + self.poly_to_active + 0.5 * contact.poly_contact.first_layer_height
|
||||||
active_to_poly_contact2 = active_top + drc("contact_to_gate") + 0.5 * self.route_layer_width
|
active_to_poly_contact2 = active_top + self.poly_contact_to_gate + 0.5 * self.route_layer_width
|
||||||
self.inputA_yoffset = max(active_contact_to_poly_contact,
|
self.inputA_yoffset = max(active_contact_to_poly_contact,
|
||||||
active_to_poly_contact,
|
active_to_poly_contact,
|
||||||
active_to_poly_contact2)
|
active_to_poly_contact2)
|
||||||
|
|
@ -233,15 +233,14 @@ class pnand3(pgate.pgate):
|
||||||
"A",
|
"A",
|
||||||
position="left")
|
position="left")
|
||||||
|
|
||||||
# Put B right on the well line
|
self.inputB_yoffset = self.inputA_yoffset + 1.2 * self.m3_pitch
|
||||||
self.inputB_yoffset = self.inputA_yoffset + non_contact_pitch
|
|
||||||
self.route_input_gate(self.pmos2_inst,
|
self.route_input_gate(self.pmos2_inst,
|
||||||
self.nmos2_inst,
|
self.nmos2_inst,
|
||||||
self.inputB_yoffset,
|
self.inputB_yoffset,
|
||||||
"B",
|
"B",
|
||||||
position="center")
|
position="center")
|
||||||
|
|
||||||
self.inputC_yoffset = self.inputB_yoffset + non_contact_pitch
|
self.inputC_yoffset = self.inputB_yoffset + 1.2 * self.m3_pitch
|
||||||
self.route_input_gate(self.pmos3_inst,
|
self.route_input_gate(self.pmos3_inst,
|
||||||
self.nmos3_inst,
|
self.nmos3_inst,
|
||||||
self.inputC_yoffset,
|
self.inputC_yoffset,
|
||||||
|
|
|
||||||
|
|
@ -196,7 +196,7 @@ class precharge(design.design):
|
||||||
pin_offset = self.lower_pmos_inst.get_pin("G").lr()
|
pin_offset = self.lower_pmos_inst.get_pin("G").lr()
|
||||||
# This is an extra space down for some techs with contact to active spacing
|
# This is an extra space down for some techs with contact to active spacing
|
||||||
contact_space = max(self.poly_space,
|
contact_space = max(self.poly_space,
|
||||||
self.contact_to_gate) + 0.5 * contact.poly_contact.first_layer_height
|
self.poly_contact_to_gate) + 0.5 * contact.poly_contact.first_layer_height
|
||||||
offset = pin_offset - vector(0, contact_space)
|
offset = pin_offset - vector(0, contact_space)
|
||||||
self.add_via_stack_center(from_layer="poly",
|
self.add_via_stack_center(from_layer="poly",
|
||||||
to_layer=self.en_layer,
|
to_layer=self.en_layer,
|
||||||
|
|
|
||||||
|
|
@ -196,7 +196,7 @@ class ptx(design.design):
|
||||||
# This is the spacing between the poly gates
|
# This is the spacing between the poly gates
|
||||||
self.min_poly_pitch = self.poly_space + self.poly_width
|
self.min_poly_pitch = self.poly_space + self.poly_width
|
||||||
self.contacted_poly_pitch = self.poly_space + contact.poly_contact.width
|
self.contacted_poly_pitch = self.poly_space + contact.poly_contact.width
|
||||||
self.contact_pitch = 2 * self.contact_to_gate + self.poly_width + self.contact_width
|
self.contact_pitch = 2 * self.active_contact_to_gate + self.poly_width + self.contact_width
|
||||||
self.poly_pitch = max(self.min_poly_pitch,
|
self.poly_pitch = max(self.min_poly_pitch,
|
||||||
self.contacted_poly_pitch,
|
self.contacted_poly_pitch,
|
||||||
self.contact_pitch)
|
self.contact_pitch)
|
||||||
|
|
@ -206,7 +206,7 @@ class ptx(design.design):
|
||||||
# Active width is determined by enclosure on both ends and contacted pitch,
|
# Active width is determined by enclosure on both ends and contacted pitch,
|
||||||
# at least one poly and n-1 poly pitches
|
# at least one poly and n-1 poly pitches
|
||||||
self.active_width = 2 * self.end_to_contact + self.active_contact.width \
|
self.active_width = 2 * self.end_to_contact + self.active_contact.width \
|
||||||
+ 2 * self.contact_to_gate + self.poly_width + (self.mults - 1) * self.poly_pitch
|
+ 2 * self.active_contact_to_gate + self.poly_width + (self.mults - 1) * self.poly_pitch
|
||||||
|
|
||||||
# Active height is just the transistor width
|
# Active height is just the transistor width
|
||||||
self.active_height = self.tx_width
|
self.active_height = self.tx_width
|
||||||
|
|
@ -321,7 +321,7 @@ class ptx(design.design):
|
||||||
"""
|
"""
|
||||||
# poly is one contacted spacing from the end and down an extension
|
# poly is one contacted spacing from the end and down an extension
|
||||||
poly_offset = self.contact_offset \
|
poly_offset = self.contact_offset \
|
||||||
+ vector(0.5 * self.active_contact.width + 0.5 * self.poly_width + self.contact_to_gate, 0)
|
+ vector(0.5 * self.active_contact.width + 0.5 * self.poly_width + self.active_contact_to_gate, 0)
|
||||||
|
|
||||||
# poly_positions are the bottom center of the poly gates
|
# poly_positions are the bottom center of the poly gates
|
||||||
self.poly_positions = []
|
self.poly_positions = []
|
||||||
|
|
|
||||||
|
|
@ -234,9 +234,9 @@ drc.add_enclosure("active",
|
||||||
enclosure = 0.005)
|
enclosure = 0.005)
|
||||||
|
|
||||||
# CONTACT.6 Minimum spacing of contact and gate
|
# CONTACT.6 Minimum spacing of contact and gate
|
||||||
drc["contact_to_gate"] = 0.0375 #changed from 0.035
|
drc["active_contact_to_gate"] = 0.0375 #changed from 0.035
|
||||||
# CONTACT.7 Minimum spacing of contact and poly
|
# CONTACT.7 Minimum spacing of contact and poly
|
||||||
drc["contact_to_poly"] = 0.090
|
drc["poly_contact_to_gate"] = 0.090
|
||||||
|
|
||||||
# CONTACT.1 Minimum width of contact
|
# CONTACT.1 Minimum width of contact
|
||||||
# CONTACT.2 Minimum spacing of contact
|
# CONTACT.2 Minimum spacing of contact
|
||||||
|
|
|
||||||
|
|
@ -217,9 +217,9 @@ drc.add_enclosure("active",
|
||||||
layer = "contact",
|
layer = "contact",
|
||||||
enclosure = _lambda_)
|
enclosure = _lambda_)
|
||||||
# Reserved for other technologies
|
# Reserved for other technologies
|
||||||
drc["contact_to_gate"] = 2*_lambda_
|
drc["active_contact_to_gate"] = 2*_lambda_
|
||||||
# 5.4 Minimum spacing to gate of transistor
|
# 5.4 Minimum spacing to gate of transistor
|
||||||
drc["contact_to_poly"] = 2*_lambda_
|
drc["poly_contact_to_gate"] = 2*_lambda_
|
||||||
|
|
||||||
# 6.1 Exact contact size
|
# 6.1 Exact contact size
|
||||||
# 5.3 Minimum contact spacing
|
# 5.3 Minimum contact spacing
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue