mirror of https://github.com/VLSIDA/OpenRAM.git
solve overlap of wmask in channel router
This commit is contained in:
parent
48a7065b31
commit
a0ff83c00a
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue