13
13
from .vector import vector
14
14
from .design import design
15
15
from openram import OPTS
16
+ import re
16
17
17
18
class channel_net ():
18
19
def __init__ (self , net_name , pins , vertical ):
@@ -318,6 +319,17 @@ def get_layer_pitch(self, layer):
318
319
debug .error ("Cannot find layer pitch." , - 1 )
319
320
return (nonpref_pitch , pitch , pitch - space , space )
320
321
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
+
321
333
def add_horizontal_trunk_with_jog (self ,
322
334
pins ,
323
335
trunk_offset ,
@@ -364,13 +376,39 @@ def add_horizontal_trunk_with_jog(self,
364
376
to_layer = self .vertical_layer ,
365
377
offset = pin_pos )
366
378
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 ())
374
412
else :
375
413
# Add the horizontal trunk
376
414
self .add_path (self .horizontal_layer ,
@@ -393,15 +431,44 @@ def add_horizontal_trunk_with_jog(self,
393
431
to_layer = self .vertical_layer ,
394
432
offset = pin_pos )
395
433
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 ())
405
472
else : # port 1, situation different, top need shift
406
473
if non_preferred_route :
407
474
# Add the horizontal trunk on the vertical layer!
@@ -412,13 +479,39 @@ def add_horizontal_trunk_with_jog(self,
412
479
# Route each pin to the trunk
413
480
for pin in pins :
414
481
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 ())
422
515
else :
423
516
pin_pos = pin .center ()
424
517
mid = vector (pin_pos .x - 0.1 , trunk_offset .y )
@@ -436,15 +529,44 @@ def add_horizontal_trunk_with_jog(self,
436
529
for pin in pins :
437
530
# Find the correct side of the pin
438
531
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 ())
448
570
else :
449
571
pin_pos = pin .center ()
450
572
mid = vector (pin_pos .x - 0.1 , trunk_offset .y )
0 commit comments