@@ -475,7 +475,7 @@ void emit_cif (pp_t *pp)
475
475
void emit_spacing (pp_t *pp, const char *nm1, const char *nm2, int amt, int touching_ok = 0 )
476
476
{
477
477
pp_printf (pp, " spacing %s %s %d %s\\ " , nm1, nm2, amt,
478
- touching_ok ? " touching_ok" : " " );
478
+ touching_ok ? " touching_ok" : " touching_illegal " );
479
479
pp_nl;
480
480
pp_printf (pp, " \" %s to %s spacing < %d \" " , nm1, nm2, amt);
481
481
pp_nl;
@@ -517,6 +517,9 @@ void emit_width_spacing (pp_t *pp, Material *mat, char *nm = NULL)
517
517
518
518
519
519
520
+ /*
521
+ Emit overhang of mat1 over nm by amt
522
+ */
520
523
void emit_overhang (pp_t *pp, Material *mat1, const char *nm, int amt)
521
524
{
522
525
if (!mat1) return ;
@@ -576,14 +579,28 @@ void emit_drc (pp_t *pp)
576
579
emit_width_spacing (pp, Technology::T->welldiff [j][i], buf);
577
580
emit_width_spacing (pp, Technology::T->well [j][i]);
578
581
emit_width_spacing (pp, Technology::T->welldiff [j][i]->getUpC ());
579
- }
580
-
581
- /* -- well to oppdiff spacing --*/
582
582
583
- /* -- fet / diff spacing, touching_ok --*/
583
+ if (Technology::T->fet [j][i] && Technology::T->diff [j][i]) {
584
+ pp_printf (pp, " # diff to contact spacing" ); pp_nl;
585
+ emit_spacing (pp, Technology::T->fet [j][i]->getName (),
586
+ Technology::T->diff [j][i]->getName (),
587
+ Technology::T->diff [j][i]->getSpacing (i), 1 );
588
+ emit_spacing (pp, Technology::T->fet [j][i]->getName (),
589
+ Technology::T->diff [j][i]->getUpC ()->getName (),
590
+ Technology::T->diff [j][i]->getViaFet () -
591
+ (Technology::T->diff [j][i]->getUpC ()->minWidth ()+1 )/2 );
592
+ }
584
593
585
- /* ndc to fet */
594
+ if (Technology::T->well [j][i]) {
595
+ WellMat *well = Technology::T->well [j][i];
596
+ emit_overhang (pp, well, Technology::T->diff [j][i]->getName (),
597
+ well->getOverhang ());
586
598
599
+ emit_spacing (pp, well->getName (),
600
+ Technology::T->diff [1 -j][i]->getName (),
601
+ well->getOverhang () + well->oppSpacing (i));
602
+ }
603
+ }
587
604
}
588
605
589
606
emit_spacing (pp, " allndiff" , " allpdiff" ,
@@ -616,10 +633,9 @@ void emit_drc (pp_t *pp)
616
633
}
617
634
}
618
635
636
+ /* poly spacing to active */
619
637
emit_spacing (pp, " allpolynonfet" , " allactivenonfet,allfet" , pspacing, 0 );
620
638
621
- /* poly spacing to active */
622
-
623
639
/* -- other poly rules --*/
624
640
625
641
@@ -659,16 +675,26 @@ void emit_extract (pp_t *pp)
659
675
}
660
676
661
677
pp_printf (pp, " planeorder comment %d" , order++);
662
-
663
- /* -- devices --
664
-
665
- fet pfet pdiff,pdc 2 pfet Vdd! nwell 50 46
666
- fet pfet pdiff,pdc 1 pfet Vdd! nwell 50 46
667
- fet nfet ndiff,ndc 2 nfet GND! pwell 56 48
668
- fet nfet ndiff,ndc 1 nfet GND! pwell 56 48
669
-
670
- */
678
+ pp_nl;
671
679
680
+ char **act_flav = config_get_table_string (" act.dev_flavors" );
681
+
682
+ for (int i=0 ; i < Technology::T->num_devs ; i++) {
683
+ /* j = 0 : nfet */
684
+ pp_printf (pp, " device mosfet nfet_%s %s allndiff %s,space Gnd!" ,
685
+ act_flav[i],
686
+ Technology::T->fet [0 ][i]->getName (),
687
+ Technology::T->well [0 ][i] ?
688
+ Technology::T->well [0 ][i]->getName () : " space/w" );
689
+ pp_nl;
690
+
691
+ pp_printf (pp, " device mosfet pfet_%s %s allpdiff %s,space Vdd!" ,
692
+ act_flav[i],
693
+ Technology::T->fet [1 ][i]->getName (),
694
+ Technology::T->well [1 ][i] ?
695
+ Technology::T->well [1 ][i]->getName () : " space/w" );
696
+ pp_nl;
697
+ }
672
698
pp_UNTAB;
673
699
pp_printf (pp, " end" );
674
700
pp_SPACE;
0 commit comments