mirror of https://github.com/VLSIDA/OpenRAM.git
More exact input spacing in pnand3
This commit is contained in:
parent
78c66d7c34
commit
0b4b5e7133
|
|
@ -12,7 +12,7 @@ from vector import vector
|
||||||
import logical_effort
|
import logical_effort
|
||||||
from sram_factory import factory
|
from sram_factory import factory
|
||||||
from globals import OPTS
|
from globals import OPTS
|
||||||
|
import contact
|
||||||
|
|
||||||
class pnand3(pgate.pgate):
|
class pnand3(pgate.pgate):
|
||||||
"""
|
"""
|
||||||
|
|
@ -209,12 +209,21 @@ class pnand3(pgate.pgate):
|
||||||
def route_inputs(self):
|
def route_inputs(self):
|
||||||
""" Route the A and B and C inputs """
|
""" Route the A and B and C inputs """
|
||||||
|
|
||||||
|
# We can use this pitch because the contacts and overlap won't be adjacent
|
||||||
|
non_contact_pitch = 0.5 * self.m1_width + self.m1_space + 0.5 * contact.poly_contact.second_layer_height
|
||||||
pmos_drain_bottom = self.pmos1_inst.get_pin("D").by()
|
pmos_drain_bottom = self.pmos1_inst.get_pin("D").by()
|
||||||
self.output_yoffset = pmos_drain_bottom - 0.5 * self.route_layer_width - self.route_layer_space
|
self.output_yoffset = pmos_drain_bottom - 0.5 * self.route_layer_width - self.route_layer_space
|
||||||
|
|
||||||
bottom_pin = self.nmos1_inst.get_pin("D")
|
bottom_pin = self.nmos1_inst.get_pin("D")
|
||||||
self.inputA_yoffset = max(bottom_pin.uy() + self.m1_pitch,
|
# active contact metal to poly contact metal spacing
|
||||||
self.nmos1_inst.uy() + self.poly_to_active)
|
active_contact_to_poly_contact = bottom_pin.uy() + self.m1_space + 0.5 * contact.poly_contact.second_layer_height
|
||||||
|
# active diffusion to poly contact spacing
|
||||||
|
# doesn't use nmos uy because that is calculated using offset + poly height
|
||||||
|
active_to_poly_contact = self.nmos1_inst.by() + self.nmos1_inst.mod.active_height \
|
||||||
|
+ self.poly_to_active + 0.5 * contact.poly_contact.first_layer_height
|
||||||
|
|
||||||
|
self.inputA_yoffset = max(active_contact_to_poly_contact,
|
||||||
|
active_to_poly_contact)
|
||||||
self.route_input_gate(self.pmos1_inst,
|
self.route_input_gate(self.pmos1_inst,
|
||||||
self.nmos1_inst,
|
self.nmos1_inst,
|
||||||
self.inputA_yoffset,
|
self.inputA_yoffset,
|
||||||
|
|
@ -222,14 +231,14 @@ class pnand3(pgate.pgate):
|
||||||
position="left")
|
position="left")
|
||||||
|
|
||||||
# Put B right on the well line
|
# Put B right on the well line
|
||||||
self.inputB_yoffset = self.inputA_yoffset + self.m1_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 + self.m1_pitch
|
self.inputC_yoffset = self.inputB_yoffset + non_contact_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,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue