solve overlap of wmask in channel router

This commit is contained in:
FriedrichWu 2024-12-23 23:44:21 +01:00
parent 48a7065b31
commit a0ff83c00a
1 changed files with 154 additions and 32 deletions

View File

@ -13,6 +13,7 @@ from openram.tech import drc
from .vector import vector from .vector import vector
from .design import design from .design import design
from openram import OPTS from openram import OPTS
import re
class channel_net(): class channel_net():
def __init__(self, net_name, pins, vertical): def __init__(self, net_name, pins, vertical):
@ -318,6 +319,17 @@ class channel_route(design):
debug.error("Cannot find layer pitch.", -1) debug.error("Cannot find layer pitch.", -1)
return (nonpref_pitch, pitch, pitch - space, space) return (nonpref_pitch, pitch, pitch - space, space)
def check_need_jog(self, pin_name):
match = re.search(r'^din\d+_(\d+)$', pin_name)
if match:
number = int(match.group(1))
if number % int(OPTS.write_size) == 0:
return True
else:
return False
else:
return False
def add_horizontal_trunk_with_jog(self, def add_horizontal_trunk_with_jog(self,
pins, pins,
trunk_offset, trunk_offset,
@ -364,13 +376,39 @@ class channel_route(design):
to_layer=self.vertical_layer, to_layer=self.vertical_layer,
offset=pin_pos) offset=pin_pos)
else: else:
pin_pos = pin.bc() if self.check_need_jog(pin.name) and (OPTS.write_size != OPTS.word_size):# for port0, only pin above track needs to check
# No bend needed here # right first
mid = vector(pin_pos.x, trunk_offset.y) self.add_via_stack_center(from_layer=pin.layer,
self.add_path(self.vertical_layer, [pin_pos, mid]) to_layer=self.vertical_layer,
self.add_via_stack_center(from_layer=pin.layer, offset=pin.rc())
to_layer=self.vertical_layer, point_1 = vector(pin.center().x + pitch, pin.center().y)
offset=pin.bc()) self.add_path(self.vertical_layer, [pin.rc(), point_1])
# straight out of bank area
self.add_via_stack_center(from_layer=self.vertical_layer,
to_layer=self.vertical_layer,
offset=point_1)
point_2 = vector(point_1.x, point_1.y - 5.6)
self.add_path(self.vertical_layer, [point_1, point_2])
# then left
self.add_via_stack_center(from_layer=self.vertical_layer,
to_layer=self.vertical_layer,
offset=point_2)
point_3 = vector(pin.center().x, pin.center().y - 5.6)
self.add_path(self.vertical_layer, [point_2, point_3])
# back to normal
self.add_via_stack_center(from_layer=self.vertical_layer,
to_layer=self.vertical_layer,
offset=point_3)
mid = vector(point_3.x, trunk_offset.y)
self.add_path(self.vertical_layer, [point_3, mid])
else: # do not need to care of wmask
pin_pos = pin.bc()
# No bend needed here
mid = vector(pin_pos.x, trunk_offset.y)
self.add_path(self.vertical_layer, [pin_pos, mid])
self.add_via_stack_center(from_layer=pin.layer,
to_layer=self.vertical_layer,
offset=pin.bc())
else: else:
# Add the horizontal trunk # Add the horizontal trunk
self.add_path(self.horizontal_layer, self.add_path(self.horizontal_layer,
@ -393,15 +431,44 @@ class channel_route(design):
to_layer=self.vertical_layer, to_layer=self.vertical_layer,
offset=pin_pos) offset=pin_pos)
else: else:
pin_pos = pin.bc() if self.check_need_jog(pin.name) and (OPTS.write_size != OPTS.word_size):# for port0, only pin above track needs to check
mid = vector(pin_pos.x, trunk_offset.y) # right first
self.add_path(self.vertical_layer, [pin_pos, mid]) self.add_via_stack_center(from_layer=pin.layer,
self.add_via_center(layers=self.layer_stack, to_layer=self.vertical_layer,
offset=mid, offset=pin.rc())
directions=self.directions) point_1 = vector(pin.center().x + pitch, pin.center().y)
self.add_via_stack_center(from_layer=pin.layer, self.add_path(self.vertical_layer, [pin.rc(), point_1])
to_layer=self.vertical_layer, # straight out of bank area
offset=pin.bc()) self.add_via_stack_center(from_layer=self.vertical_layer,
to_layer=self.vertical_layer,
offset=point_1)
point_2 = vector(point_1.x, point_1.y - 5.6)
self.add_path(self.vertical_layer, [point_1, point_2])
# then left
self.add_via_stack_center(from_layer=self.vertical_layer,
to_layer=self.vertical_layer,
offset=point_2)
point_3 = vector(pin.center().x, pin.center().y - 5.6)
self.add_path(self.vertical_layer, [point_2, point_3])
# back to normal
self.add_via_stack_center(from_layer=self.vertical_layer,
to_layer=self.vertical_layer,
offset=point_3)
mid = vector(point_3.x, trunk_offset.y)
self.add_path(self.vertical_layer, [point_3, mid])
self.add_via_center(layers=self.layer_stack,
offset=mid,
directions=self.directions)
else: # do not need to care of wmask
pin_pos = pin.bc()
mid = vector(pin_pos.x, trunk_offset.y)
self.add_path(self.vertical_layer, [pin_pos, mid])
self.add_via_center(layers=self.layer_stack,
offset=mid,
directions=self.directions)
self.add_via_stack_center(from_layer=pin.layer,
to_layer=self.vertical_layer,
offset=pin.bc())
else: # port 1, situation different, top need shift else: # port 1, situation different, top need shift
if non_preferred_route: if non_preferred_route:
# Add the horizontal trunk on the vertical layer! # Add the horizontal trunk on the vertical layer!
@ -412,13 +479,39 @@ class channel_route(design):
# Route each pin to the trunk # Route each pin to the trunk
for pin in pins: for pin in pins:
if pin.cy() < trunk_offset.y: if pin.cy() < trunk_offset.y:
pin_pos = pin.uc() if self.check_need_jog(pin.name) and (OPTS.write_size != OPTS.word_size):# for port0, only pin above track needs to check
# No bend needed here # right first
mid = vector(pin_pos.x, trunk_offset.y) self.add_via_stack_center(from_layer=pin.layer,
self.add_path(self.vertical_layer, [pin_pos, mid]) to_layer=self.vertical_layer,
self.add_via_stack_center(from_layer=pin.layer, offset=pin.rc())
to_layer=self.vertical_layer, point_1 = vector(pin.center().x + pitch, pin.center().y)
offset=pin.uc()) self.add_path(self.vertical_layer, [pin.rc(), point_1])
# straight out of bank area
self.add_via_stack_center(from_layer=self.vertical_layer,
to_layer=self.vertical_layer,
offset=point_1)
point_2 = vector(point_1.x, point_1.y + 5.6)
self.add_path(self.vertical_layer, [point_1, point_2])
# then left
self.add_via_stack_center(from_layer=self.vertical_layer,
to_layer=self.vertical_layer,
offset=point_2)
point_3 = vector(pin.center().x, pin.center().y + 5.6)
self.add_path(self.vertical_layer, [point_2, point_3])
# back to normal
self.add_via_stack_center(from_layer=self.vertical_layer,
to_layer=self.vertical_layer,
offset=point_3)
mid = vector(point_3.x, trunk_offset.y)
self.add_path(self.vertical_layer, [point_3, mid])
else: # do not need to care of wmask
pin_pos = pin.uc()
# No bend needed here
mid = vector(pin_pos.x, trunk_offset.y)
self.add_path(self.vertical_layer, [pin_pos, mid])
self.add_via_stack_center(from_layer=pin.layer,
to_layer=self.vertical_layer,
offset=pin.uc())
else: else:
pin_pos = pin.center() pin_pos = pin.center()
mid = vector(pin_pos.x - 0.1, trunk_offset.y) mid = vector(pin_pos.x - 0.1, trunk_offset.y)
@ -436,15 +529,44 @@ class channel_route(design):
for pin in pins: for pin in pins:
# Find the correct side of the pin # Find the correct side of the pin
if pin.cy() < trunk_offset.y: if pin.cy() < trunk_offset.y:
pin_pos = pin.uc() if self.check_need_jog(pin.name) and (OPTS.write_size != OPTS.word_size):# for port0, only pin above track needs to check
mid = vector(pin_pos.x, trunk_offset.y) # right first
self.add_path(self.vertical_layer, [pin_pos, mid]) self.add_via_stack_center(from_layer=pin.layer,
self.add_via_center(layers=self.layer_stack, to_layer=self.vertical_layer,
offset=mid, offset=pin.rc())
directions=self.directions) point_1 = vector(pin.center().x + pitch, pin.center().y)
self.add_via_stack_center(from_layer=pin.layer, self.add_path(self.vertical_layer, [pin.rc(), point_1])
to_layer=self.vertical_layer, # straight out of bank area
offset=pin.uc()) self.add_via_stack_center(from_layer=self.vertical_layer,
to_layer=self.vertical_layer,
offset=point_1)
point_2 = vector(point_1.x, point_1.y + 5.6)
self.add_path(self.vertical_layer, [point_1, point_2])
# then left
self.add_via_stack_center(from_layer=self.vertical_layer,
to_layer=self.vertical_layer,
offset=point_2)
point_3 = vector(pin.center().x, pin.center().y + 5.6)
self.add_path(self.vertical_layer, [point_2, point_3])
# back to normal
self.add_via_stack_center(from_layer=self.vertical_layer,
to_layer=self.vertical_layer,
offset=point_3)
mid = vector(point_3.x, trunk_offset.y)
self.add_path(self.vertical_layer, [point_3, mid])
self.add_via_center(layers=self.layer_stack,
offset=mid,
directions=self.directions)
else: # do not need to care of wmask
pin_pos = pin.uc()
mid = vector(pin_pos.x, trunk_offset.y)
self.add_path(self.vertical_layer, [pin_pos, mid])
self.add_via_center(layers=self.layer_stack,
offset=mid,
directions=self.directions)
self.add_via_stack_center(from_layer=pin.layer,
to_layer=self.vertical_layer,
offset=pin.uc())
else: else:
pin_pos = pin.center() pin_pos = pin.center()
mid = vector(pin_pos.x - 0.1, trunk_offset.y) mid = vector(pin_pos.x - 0.1, trunk_offset.y)