From 0b4b5e713361277beb10cd69e51cab1d4e33afc6 Mon Sep 17 00:00:00 2001 From: mrg Date: Wed, 10 Jun 2020 16:19:24 -0700 Subject: [PATCH] More exact input spacing in pnand3 --- compiler/pgates/pnand3.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/compiler/pgates/pnand3.py b/compiler/pgates/pnand3.py index fa028246..31024d82 100644 --- a/compiler/pgates/pnand3.py +++ b/compiler/pgates/pnand3.py @@ -12,7 +12,7 @@ from vector import vector import logical_effort from sram_factory import factory from globals import OPTS - +import contact class pnand3(pgate.pgate): """ @@ -209,12 +209,21 @@ class pnand3(pgate.pgate): def route_inputs(self): """ 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() self.output_yoffset = pmos_drain_bottom - 0.5 * self.route_layer_width - self.route_layer_space bottom_pin = self.nmos1_inst.get_pin("D") - self.inputA_yoffset = max(bottom_pin.uy() + self.m1_pitch, - self.nmos1_inst.uy() + self.poly_to_active) + # active contact metal to poly contact metal spacing + 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.nmos1_inst, self.inputA_yoffset, @@ -222,14 +231,14 @@ class pnand3(pgate.pgate): position="left") # 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.nmos2_inst, self.inputB_yoffset, "B", 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.nmos3_inst, self.inputC_yoffset,