mirror of https://github.com/VLSIDA/OpenRAM.git
Cleanup.
This commit is contained in:
parent
4ad920eaf7
commit
bec12f5b94
File diff suppressed because it is too large
Load Diff
|
|
@ -62,7 +62,7 @@ class ptx(design.design):
|
||||||
#ur = self.find_highest_coords()
|
#ur = self.find_highest_coords()
|
||||||
#self.add_boundary(ll, ur)
|
#self.add_boundary(ll, ur)
|
||||||
|
|
||||||
# (0,0) will be the corner ofthe active area (not the larger well)
|
# (0,0) will be the corner of the active area (not the larger well)
|
||||||
self.translate_all(self.active_offset)
|
self.translate_all(self.active_offset)
|
||||||
|
|
||||||
def create_layout(self):
|
def create_layout(self):
|
||||||
|
|
@ -108,8 +108,8 @@ class ptx(design.design):
|
||||||
Pre-compute some handy layout parameters.
|
Pre-compute some handy layout parameters.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if self.num_contacts==None:
|
if not self.num_contacts:
|
||||||
self.num_contacts=self.calculate_num_contacts()
|
self.num_contacts = self.calculate_num_contacts()
|
||||||
|
|
||||||
# Determine layer types needed
|
# Determine layer types needed
|
||||||
if self.tx_type == "nmos":
|
if self.tx_type == "nmos":
|
||||||
|
|
@ -119,8 +119,7 @@ class ptx(design.design):
|
||||||
self.implant_type = "p"
|
self.implant_type = "p"
|
||||||
self.well_type = "n"
|
self.well_type = "n"
|
||||||
else:
|
else:
|
||||||
self.error("Invalid transitor type.",-1)
|
self.error("Invalid transitor type.", -1)
|
||||||
|
|
||||||
|
|
||||||
# This is not actually instantiated but used for calculations
|
# This is not actually instantiated but used for calculations
|
||||||
self.active_contact = factory.create(module_type="contact",
|
self.active_contact = factory.create(module_type="contact",
|
||||||
|
|
@ -128,28 +127,30 @@ class ptx(design.design):
|
||||||
directions = ("V", "V"),
|
directions = ("V", "V"),
|
||||||
dimensions=(1, self.num_contacts))
|
dimensions=(1, self.num_contacts))
|
||||||
|
|
||||||
|
|
||||||
# The contacted poly pitch (or uncontacted in an odd technology)
|
# The contacted poly pitch (or uncontacted in an odd technology)
|
||||||
self.poly_pitch = max(2 * self.contact_to_gate + self.contact_width + self.poly_width,
|
self.poly_pitch = max(2 * self.contact_to_gate + self.contact_width + self.poly_width,
|
||||||
self.poly_space)
|
self.poly_space)
|
||||||
|
|
||||||
# The contacted poly pitch (or uncontacted in an odd technology)
|
# The contacted poly pitch (or uncontacted in an odd technology)
|
||||||
self.contact_pitch = 2 * self.contact_to_gate + self.contact_width + self.poly_width
|
self.contact_pitch = 2 * self.contact_to_gate + \
|
||||||
|
self.contact_width + self.poly_width
|
||||||
|
|
||||||
# The enclosure of an active contact. Not sure about second term.
|
# The enclosure of an active contact. Not sure about second term.
|
||||||
active_enclose_contact = max(self.active_enclose_contact,
|
active_enclose_contact = max(self.active_enclose_contact,
|
||||||
(self.active_width - self.contact_width) / 2)
|
(self.active_width - self.contact_width) / 2)
|
||||||
|
|
||||||
# This is the distance from the edge of poly to the contacted end of active
|
# This is the distance from the edge of
|
||||||
self.end_to_poly = active_enclose_contact + self.contact_width + self.contact_to_gate
|
# poly to the contacted end of active
|
||||||
|
self.end_to_poly = active_enclose_contact + \
|
||||||
|
self.contact_width + self.contact_to_gate
|
||||||
|
|
||||||
# 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_poly + self.poly_width + (self.mults - 1) * self.poly_pitch
|
self.ptx_active_width = 2 * self.end_to_poly + 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.ptx_active_height = self.tx_width
|
||||||
|
|
||||||
# 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
|
||||||
|
|
@ -177,11 +178,11 @@ class ptx(design.design):
|
||||||
|
|
||||||
# This is the center of the first active contact offset (centered vertically)
|
# This is the center of the first active contact offset (centered vertically)
|
||||||
self.contact_offset = self.active_offset + vector(active_enclose_contact + 0.5 * self.contact_width,
|
self.contact_offset = self.active_offset + vector(active_enclose_contact + 0.5 * self.contact_width,
|
||||||
0.5 * self.active_height)
|
0.5 * self.ptx_active_height)
|
||||||
|
|
||||||
|
|
||||||
# Min area results are just flagged for now.
|
# Min area results are just flagged for now.
|
||||||
debug.check(self.active_width * self.active_height >= self.minarea_active,
|
debug.check(self.ptx_active_width * self.ptx_active_height >= self.minarea_active,
|
||||||
"Minimum active area violated.")
|
"Minimum active area violated.")
|
||||||
# We do not want to increase the poly dimensions to fix
|
# We do not want to increase the poly dimensions to fix
|
||||||
# an area problem as it would cause an LVS issue.
|
# an area problem as it would cause an LVS issue.
|
||||||
|
|
@ -215,14 +216,14 @@ class ptx(design.design):
|
||||||
poly_offset = poly_positions[0] + vector(-0.5 * self.poly_width,
|
poly_offset = poly_positions[0] + vector(-0.5 * self.poly_width,
|
||||||
distance_above_active)
|
distance_above_active)
|
||||||
# Remove the old pin and add the new one
|
# Remove the old pin and add the new one
|
||||||
self.remove_layout_pin("G") # only keep the main pin
|
# only keep the main pin
|
||||||
|
self.remove_layout_pin("G")
|
||||||
self.add_layout_pin(text="G",
|
self.add_layout_pin(text="G",
|
||||||
layer="poly",
|
layer="poly",
|
||||||
offset=poly_offset,
|
offset=poly_offset,
|
||||||
width=poly_width,
|
width=poly_width,
|
||||||
height=self.poly_width)
|
height=self.poly_width)
|
||||||
|
|
||||||
|
|
||||||
def connect_fingered_active(self, drain_positions, source_positions):
|
def connect_fingered_active(self, drain_positions, source_positions):
|
||||||
"""
|
"""
|
||||||
Connect each contact up/down to a source or drain pin
|
Connect each contact up/down to a source or drain pin
|
||||||
|
|
@ -230,10 +231,10 @@ class ptx(design.design):
|
||||||
|
|
||||||
# This is the distance that we must route up or down from the center
|
# This is the distance that we must route up or down from the center
|
||||||
# of the contacts to avoid DRC violations to the other contacts
|
# of the contacts to avoid DRC violations to the other contacts
|
||||||
pin_offset = vector(0, 0.5 * self.active_contact.second_layer_height \
|
pin_offset = vector(0, 0.5 * self.active_contact.second_layer_height
|
||||||
+ self.m1_space + 0.5 * self.m1_width)
|
+ self.m1_space + 0.5 * self.m1_width)
|
||||||
# This is the width of a m1 extend the ends of the pin
|
# This is the width of a m1 extend the ends of the pin
|
||||||
end_offset = vector(self.m1_width/2,0)
|
end_offset = vector(self.m1_width / 2.0, 0)
|
||||||
|
|
||||||
# drains always go to the MIDDLE of the cell,
|
# drains always go to the MIDDLE of the cell,
|
||||||
# so top of NMOS, bottom of PMOS
|
# so top of NMOS, bottom of PMOS
|
||||||
|
|
@ -246,8 +247,9 @@ class ptx(design.design):
|
||||||
source_dir = -1
|
source_dir = -1
|
||||||
|
|
||||||
if len(source_positions) > 1:
|
if len(source_positions) > 1:
|
||||||
source_offset = pin_offset.scale(source_dir,source_dir)
|
source_offset = pin_offset.scale(source_dir, source_dir)
|
||||||
self.remove_layout_pin("S") # remove the individual connections
|
# remove the individual connections
|
||||||
|
self.remove_layout_pin("S")
|
||||||
# Add each vertical segment
|
# Add each vertical segment
|
||||||
for a in source_positions:
|
for a in source_positions:
|
||||||
self.add_path(("m1"),
|
self.add_path(("m1"),
|
||||||
|
|
@ -310,16 +312,16 @@ class ptx(design.design):
|
||||||
"""
|
"""
|
||||||
self.add_rect(layer="active",
|
self.add_rect(layer="active",
|
||||||
offset=self.active_offset,
|
offset=self.active_offset,
|
||||||
width=self.active_width,
|
width=self.ptx_active_width,
|
||||||
height=self.active_height)
|
height=self.ptx_active_height)
|
||||||
# If the implant must enclose the active, shift offset
|
# If the implant must enclose the active, shift offset
|
||||||
# and increase width/height
|
# and increase width/height
|
||||||
enclose_width = self.implant_enclose_active
|
enclose_width = self.implant_enclose_active
|
||||||
enclose_offset = [enclose_width] * 2
|
enclose_offset = [enclose_width] * 2
|
||||||
self.add_rect(layer="{}implant".format(self.implant_type),
|
self.add_rect(layer="{}implant".format(self.implant_type),
|
||||||
offset=self.active_offset - enclose_offset,
|
offset=self.active_offset - enclose_offset,
|
||||||
width=self.active_width + 2 * enclose_width,
|
width=self.ptx_active_width + 2 * enclose_width,
|
||||||
height=self.active_height + 2 * enclose_width)
|
height=self.ptx_active_height + 2 * enclose_width)
|
||||||
|
|
||||||
def add_well_implant(self):
|
def add_well_implant(self):
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue