Skip to content

Commit a0ff83c

Browse files
committed
solve overlap of wmask in channel router
1 parent 48a7065 commit a0ff83c

File tree

1 file changed

+154
-32
lines changed

1 file changed

+154
-32
lines changed

compiler/base/channel_route.py

Lines changed: 154 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from .vector import vector
1414
from .design import design
1515
from openram import OPTS
16+
import re
1617

1718
class channel_net():
1819
def __init__(self, net_name, pins, vertical):
@@ -318,6 +319,17 @@ def get_layer_pitch(self, layer):
318319
debug.error("Cannot find layer pitch.", -1)
319320
return (nonpref_pitch, pitch, pitch - space, space)
320321

322+
def check_need_jog(self, pin_name):
323+
match = re.search(r'^din\d+_(\d+)$', pin_name)
324+
if match:
325+
number = int(match.group(1))
326+
if number % int(OPTS.write_size) == 0:
327+
return True
328+
else:
329+
return False
330+
else:
331+
return False
332+
321333
def add_horizontal_trunk_with_jog(self,
322334
pins,
323335
trunk_offset,
@@ -364,13 +376,39 @@ def add_horizontal_trunk_with_jog(self,
364376
to_layer=self.vertical_layer,
365377
offset=pin_pos)
366378
else:
367-
pin_pos = pin.bc()
368-
# No bend needed here
369-
mid = vector(pin_pos.x, trunk_offset.y)
370-
self.add_path(self.vertical_layer, [pin_pos, mid])
371-
self.add_via_stack_center(from_layer=pin.layer,
372-
to_layer=self.vertical_layer,
373-
offset=pin.bc())
379+
if self.check_need_jog(pin.name) and (OPTS.write_size != OPTS.word_size):# for port0, only pin above track needs to check
380+
# right first
381+
self.add_via_stack_center(from_layer=pin.layer,
382+
to_layer=self.vertical_layer,
383+
offset=pin.rc())
384+
point_1 = vector(pin.center().x + pitch, pin.center().y)
385+
self.add_path(self.vertical_layer, [pin.rc(), point_1])
386+
# straight out of bank area
387+
self.add_via_stack_center(from_layer=self.vertical_layer,
388+
to_layer=self.vertical_layer,
389+
offset=point_1)
390+
point_2 = vector(point_1.x, point_1.y - 5.6)
391+
self.add_path(self.vertical_layer, [point_1, point_2])
392+
# then left
393+
self.add_via_stack_center(from_layer=self.vertical_layer,
394+
to_layer=self.vertical_layer,
395+
offset=point_2)
396+
point_3 = vector(pin.center().x, pin.center().y - 5.6)
397+
self.add_path(self.vertical_layer, [point_2, point_3])
398+
# back to normal
399+
self.add_via_stack_center(from_layer=self.vertical_layer,
400+
to_layer=self.vertical_layer,
401+
offset=point_3)
402+
mid = vector(point_3.x, trunk_offset.y)
403+
self.add_path(self.vertical_layer, [point_3, mid])
404+
else: # do not need to care of wmask
405+
pin_pos = pin.bc()
406+
# No bend needed here
407+
mid = vector(pin_pos.x, trunk_offset.y)
408+
self.add_path(self.vertical_layer, [pin_pos, mid])
409+
self.add_via_stack_center(from_layer=pin.layer,
410+
to_layer=self.vertical_layer,
411+
offset=pin.bc())
374412
else:
375413
# Add the horizontal trunk
376414
self.add_path(self.horizontal_layer,
@@ -393,15 +431,44 @@ def add_horizontal_trunk_with_jog(self,
393431
to_layer=self.vertical_layer,
394432
offset=pin_pos)
395433
else:
396-
pin_pos = pin.bc()
397-
mid = vector(pin_pos.x, trunk_offset.y)
398-
self.add_path(self.vertical_layer, [pin_pos, mid])
399-
self.add_via_center(layers=self.layer_stack,
400-
offset=mid,
401-
directions=self.directions)
402-
self.add_via_stack_center(from_layer=pin.layer,
403-
to_layer=self.vertical_layer,
404-
offset=pin.bc())
434+
if self.check_need_jog(pin.name) and (OPTS.write_size != OPTS.word_size):# for port0, only pin above track needs to check
435+
# right first
436+
self.add_via_stack_center(from_layer=pin.layer,
437+
to_layer=self.vertical_layer,
438+
offset=pin.rc())
439+
point_1 = vector(pin.center().x + pitch, pin.center().y)
440+
self.add_path(self.vertical_layer, [pin.rc(), point_1])
441+
# straight out of bank area
442+
self.add_via_stack_center(from_layer=self.vertical_layer,
443+
to_layer=self.vertical_layer,
444+
offset=point_1)
445+
point_2 = vector(point_1.x, point_1.y - 5.6)
446+
self.add_path(self.vertical_layer, [point_1, point_2])
447+
# then left
448+
self.add_via_stack_center(from_layer=self.vertical_layer,
449+
to_layer=self.vertical_layer,
450+
offset=point_2)
451+
point_3 = vector(pin.center().x, pin.center().y - 5.6)
452+
self.add_path(self.vertical_layer, [point_2, point_3])
453+
# back to normal
454+
self.add_via_stack_center(from_layer=self.vertical_layer,
455+
to_layer=self.vertical_layer,
456+
offset=point_3)
457+
mid = vector(point_3.x, trunk_offset.y)
458+
self.add_path(self.vertical_layer, [point_3, mid])
459+
self.add_via_center(layers=self.layer_stack,
460+
offset=mid,
461+
directions=self.directions)
462+
else: # do not need to care of wmask
463+
pin_pos = pin.bc()
464+
mid = vector(pin_pos.x, trunk_offset.y)
465+
self.add_path(self.vertical_layer, [pin_pos, mid])
466+
self.add_via_center(layers=self.layer_stack,
467+
offset=mid,
468+
directions=self.directions)
469+
self.add_via_stack_center(from_layer=pin.layer,
470+
to_layer=self.vertical_layer,
471+
offset=pin.bc())
405472
else: # port 1, situation different, top need shift
406473
if non_preferred_route:
407474
# Add the horizontal trunk on the vertical layer!
@@ -412,13 +479,39 @@ def add_horizontal_trunk_with_jog(self,
412479
# Route each pin to the trunk
413480
for pin in pins:
414481
if pin.cy() < trunk_offset.y:
415-
pin_pos = pin.uc()
416-
# No bend needed here
417-
mid = vector(pin_pos.x, trunk_offset.y)
418-
self.add_path(self.vertical_layer, [pin_pos, mid])
419-
self.add_via_stack_center(from_layer=pin.layer,
420-
to_layer=self.vertical_layer,
421-
offset=pin.uc())
482+
if self.check_need_jog(pin.name) and (OPTS.write_size != OPTS.word_size):# for port0, only pin above track needs to check
483+
# right first
484+
self.add_via_stack_center(from_layer=pin.layer,
485+
to_layer=self.vertical_layer,
486+
offset=pin.rc())
487+
point_1 = vector(pin.center().x + pitch, pin.center().y)
488+
self.add_path(self.vertical_layer, [pin.rc(), point_1])
489+
# straight out of bank area
490+
self.add_via_stack_center(from_layer=self.vertical_layer,
491+
to_layer=self.vertical_layer,
492+
offset=point_1)
493+
point_2 = vector(point_1.x, point_1.y + 5.6)
494+
self.add_path(self.vertical_layer, [point_1, point_2])
495+
# then left
496+
self.add_via_stack_center(from_layer=self.vertical_layer,
497+
to_layer=self.vertical_layer,
498+
offset=point_2)
499+
point_3 = vector(pin.center().x, pin.center().y + 5.6)
500+
self.add_path(self.vertical_layer, [point_2, point_3])
501+
# back to normal
502+
self.add_via_stack_center(from_layer=self.vertical_layer,
503+
to_layer=self.vertical_layer,
504+
offset=point_3)
505+
mid = vector(point_3.x, trunk_offset.y)
506+
self.add_path(self.vertical_layer, [point_3, mid])
507+
else: # do not need to care of wmask
508+
pin_pos = pin.uc()
509+
# No bend needed here
510+
mid = vector(pin_pos.x, trunk_offset.y)
511+
self.add_path(self.vertical_layer, [pin_pos, mid])
512+
self.add_via_stack_center(from_layer=pin.layer,
513+
to_layer=self.vertical_layer,
514+
offset=pin.uc())
422515
else:
423516
pin_pos = pin.center()
424517
mid = vector(pin_pos.x - 0.1, trunk_offset.y)
@@ -436,15 +529,44 @@ def add_horizontal_trunk_with_jog(self,
436529
for pin in pins:
437530
# Find the correct side of the pin
438531
if pin.cy() < trunk_offset.y:
439-
pin_pos = pin.uc()
440-
mid = vector(pin_pos.x, trunk_offset.y)
441-
self.add_path(self.vertical_layer, [pin_pos, mid])
442-
self.add_via_center(layers=self.layer_stack,
443-
offset=mid,
444-
directions=self.directions)
445-
self.add_via_stack_center(from_layer=pin.layer,
446-
to_layer=self.vertical_layer,
447-
offset=pin.uc())
532+
if self.check_need_jog(pin.name) and (OPTS.write_size != OPTS.word_size):# for port0, only pin above track needs to check
533+
# right first
534+
self.add_via_stack_center(from_layer=pin.layer,
535+
to_layer=self.vertical_layer,
536+
offset=pin.rc())
537+
point_1 = vector(pin.center().x + pitch, pin.center().y)
538+
self.add_path(self.vertical_layer, [pin.rc(), point_1])
539+
# straight out of bank area
540+
self.add_via_stack_center(from_layer=self.vertical_layer,
541+
to_layer=self.vertical_layer,
542+
offset=point_1)
543+
point_2 = vector(point_1.x, point_1.y + 5.6)
544+
self.add_path(self.vertical_layer, [point_1, point_2])
545+
# then left
546+
self.add_via_stack_center(from_layer=self.vertical_layer,
547+
to_layer=self.vertical_layer,
548+
offset=point_2)
549+
point_3 = vector(pin.center().x, pin.center().y + 5.6)
550+
self.add_path(self.vertical_layer, [point_2, point_3])
551+
# back to normal
552+
self.add_via_stack_center(from_layer=self.vertical_layer,
553+
to_layer=self.vertical_layer,
554+
offset=point_3)
555+
mid = vector(point_3.x, trunk_offset.y)
556+
self.add_path(self.vertical_layer, [point_3, mid])
557+
self.add_via_center(layers=self.layer_stack,
558+
offset=mid,
559+
directions=self.directions)
560+
else: # do not need to care of wmask
561+
pin_pos = pin.uc()
562+
mid = vector(pin_pos.x, trunk_offset.y)
563+
self.add_path(self.vertical_layer, [pin_pos, mid])
564+
self.add_via_center(layers=self.layer_stack,
565+
offset=mid,
566+
directions=self.directions)
567+
self.add_via_stack_center(from_layer=pin.layer,
568+
to_layer=self.vertical_layer,
569+
offset=pin.uc())
448570
else:
449571
pin_pos = pin.center()
450572
mid = vector(pin_pos.x - 0.1, trunk_offset.y)

0 commit comments

Comments
 (0)