From b70258cfc91b8959e51a6963004b9d3372c3ec65 Mon Sep 17 00:00:00 2001 From: Franck Wajsburt Date: Tue, 4 Jun 2002 14:08:21 +0000 Subject: [PATCH] =?UTF-8?q?changement=20de=20version=20changement=20de=20s?= =?UTF-8?q?trategie=20pour=20la=20g=C3=A9n=C3=A9ration=20des=20NWELL,=20PW?= =?UTF-8?q?ELL,=20NIMP,=20PIMP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1) dans le fichier technoi (.rds) on ne genere du RDS_NWELL qu'a partir du NWELL dessiné explicitement par l'utilisateur 2) S2R genere le PWELL = (ABOX + 0.5*RD_NIMP) - NWELL autrement dit on grossit l'AB de 0.5 fois la distance min entre 2 NINP et on retire ce qui intersecte de NWELL La raison pour laquelle on fait grossir l'AB est que si on place un body tie a une demi regle de dessin du bord de l'AB, alors en reel, la distance qui separe la zone d'implant du tie du bord de l'AB est inférieure a la largeur min de l'implant de la diff, et c'est pour ca que l'on fait grossir l'AB. 3) S2R regenere le NWELL = (ABOX + 0.5*RD_PIMP) - PWELL 4) S2R regenere le NIMP = PWELL - PTIE 5) S2R regenere le PIMP = NWELL - NTIE --- alliance/src/s2r/src/main.c | 2 +- alliance/src/s2r/src/postrat.c | 33 +++++++------- alliance/src/s2r/src/rdsacces.c | 78 ++++++++++++++++++++++++++++++++- 3 files changed, 95 insertions(+), 18 deletions(-) diff --git a/alliance/src/s2r/src/main.c b/alliance/src/s2r/src/main.c index c268d9b6..9fbc4989 100644 --- a/alliance/src/s2r/src/main.c +++ b/alliance/src/s2r/src/main.c @@ -227,7 +227,7 @@ int main (argc, argv) mbk_model = getphfig (source_name, 'A'); if (!root_conn) mbk_model->PHCON = NULL; - rds_model = S2Rfigmbkrds (mbk_model, one_level ? 0 : 1); + rds_model = S2Rfigmbkrds (mbk_model, one_level ? 0 : 1, sub_conn); /* Removing symbolic data structure */ diff --git a/alliance/src/s2r/src/postrat.c b/alliance/src/s2r/src/postrat.c index fad688ad..58c0fb51 100644 --- a/alliance/src/s2r/src/postrat.c +++ b/alliance/src/s2r/src/postrat.c @@ -932,21 +932,16 @@ static void addpwell (model, verbose) { rdsrec_list *rectab = model->LAYERTAB[RDS_ABOX]; int f = MBK_SEGMENT_MASK | RDS_FIG_REC_MASK; - long qty = GET_S2R_OVERSIZE (RDS_NIMP); - model->LAYERTAB[RDS_PWELL] = rds_rectangle_in (model->LAYERTAB[RDS_PWELL], - rectab->X-qty, rectab->Y-qty, rectab->DX+2*qty, rectab->DY+2*qty, RDS_PWELL,f,NULL); + + // ajout d'un rectangle de PWELL avec la taille de l'ABOX + OVERSIZE(RDS_NIMP) + // puis on on elimine le PWELL qui intersecte le NWELL + model->LAYERTAB[RDS_PWELL] = rds_rectangle_in (NULL, rectab->X-qty, rectab->Y-qty, rectab->DX+2*qty, rectab->DY+2*qty, RDS_PWELL,f,NULL); cutcut (model, RDS_PWELL, RDS_NWELL); - qty = GET_S2R_OVERSIZE (RDS_NIMP); - model->LAYERTAB[RDS_USER9] = rds_rectangle_in (NULL, rectab->X-qty, rectab->Y-qty, rectab->DX+2*qty, rectab->DY+2*qty, RDS_NWELL, f, NULL); - cutcut (model, RDS_USER9, RDS_PWELL); - model->LAYERTAB[NWELL] = model->LAYERTAB[RDS_USER9]; - - qty = GET_S2R_OVERSIZE (RDS_PIMP); - model->LAYERTAB[RDS_USER9] = rds_rectangle_in (NULL, rectab->X-qty, rectab->Y-qty, rectab->DX+2*qty, rectab->DY+2*qty, RDS_PWELL, f, NULL); - cutcut (model, RDS_USER9, RDS_NWELL); - model->LAYERTAB[PWELL] = model->LAYERTAB[RDS_USER9]; + // on recalcule de NWELL a partir du PWELL + model->LAYERTAB[RDS_NWELL] = rds_rectangle_in (NULL, rectab->X-qty, rectab->Y-qty, rectab->DX+2*qty, rectab->DY+2*qty, RDS_PWELL,f,NULL); + cutcut (model, RDS_NWELL, RDS_PWELL); } } } @@ -966,13 +961,21 @@ static void addimp (model, verbose) if (model->INSTANCE == NULL && model->LAYERTAB[RDS_NWELL] != NULL) { + rdsrec_list *rectab = model->LAYERTAB[RDS_ABOX]; + long qty = 0; + + model->LAYERTAB[RDS_PIMP] = NULL; + model->LAYERTAB[RDS_NIMP] = NULL; + for (r = model->LAYERTAB[RDS_NWELL]; r; r = r->NEXT) model->LAYERTAB[RDS_PIMP] = rds_rectangle_in (model->LAYERTAB[RDS_PIMP], r->X, r->Y, r->DX, r->DY, RDS_PIMP, f, NULL); - for (r = model->LAYERTAB[RDS_PWELL]; r; r = r->NEXT) model->LAYERTAB[RDS_NIMP] = rds_rectangle_in (model->LAYERTAB[RDS_NIMP], r->X, r->Y, r->DX, r->DY, RDS_NIMP, f, NULL); - cutcut (model, RDS_NIMP, RDS_PTIE); - cutcut (model, RDS_PIMP, RDS_NTIE); + + if (model->LAYERTAB[RDS_NIMP] != NULL) + cutcut (model, RDS_NIMP, RDS_PTIE); + if (model->LAYERTAB[RDS_PIMP] != NULL) + cutcut (model, RDS_PIMP, RDS_NTIE); } } diff --git a/alliance/src/s2r/src/rdsacces.c b/alliance/src/s2r/src/rdsacces.c index 75656436..42480651 100644 --- a/alliance/src/s2r/src/rdsacces.c +++ b/alliance/src/s2r/src/rdsacces.c @@ -561,13 +561,39 @@ static chain_list *make_model_list (fig) | Transform a hierarchy Mbk -> Rds | \------------------------------------------------------*/ -rdsfig_list *S2Rfigmbkrds (FigureMbk, All) +rdsfig_list *S2Rfigmbkrds (FigureMbk, All,SubConn) phfig_list *FigureMbk; char All; + char SubConn; { rdsfig_list *FigureRds; chain_list *Pt; - + + /* dupplique tous les CALUx en ALUx dans le père pour permettre + l'unification des pastilles de metal de VIA et des ALU associés */ + { + phseg_list * phseg; + for (phseg = FigureMbk->PHSEG; phseg; phseg=phseg->NEXT) + { + phseg_list * dupseg = addphseg(FigureMbk, + phseg->LAYER, phseg->WIDTH, + phseg->X1, phseg->Y1, + phseg->X2, phseg->Y2, phseg->NAME); + switch (phseg->LAYER) + { + case CALU1 : dupseg->LAYER = ALU1; break; + case CALU2 : dupseg->LAYER = ALU2; break; + case CALU3 : dupseg->LAYER = ALU3; break; + case CALU4 : dupseg->LAYER = ALU4; break; + case CALU5 : dupseg->LAYER = ALU5; break; + case CALU6 : dupseg->LAYER = ALU6; break; + case CALU7 : dupseg->LAYER = ALU7; break; + case CALU8 : dupseg->LAYER = ALU8; break; + case CALU9 : dupseg->LAYER = ALU9; break; + } + dupseg->NAME = NULL; + } + } if (All) { Pt = make_model_list (FigureMbk); @@ -587,7 +613,55 @@ rdsfig_list *S2Rfigmbkrds (FigureMbk, All) FigureRds = figmbkrds ((phfig_list *) Pt->DATA, 0, 0); for (Pt = Pt->NEXT; Pt != NULL; Pt = Pt->NEXT) + { + if (SubConn == 0) /* puisqu'on ne veut pas de connecteurs + intermediaires, on remplace les CALU par les ALU associés FW 200205 */ + { + phseg_list * phseg; + for (phseg = ((phfig_list *) Pt->DATA)->PHSEG; phseg; phseg=phseg->NEXT) + { + switch (phseg->LAYER) + { + case CALU1 : phseg->LAYER = ALU1; break; + case CALU2 : phseg->LAYER = ALU2; break; + case CALU3 : phseg->LAYER = ALU3; break; + case CALU4 : phseg->LAYER = ALU4; break; + case CALU5 : phseg->LAYER = ALU5; break; + case CALU6 : phseg->LAYER = ALU6; break; + case CALU7 : phseg->LAYER = ALU7; break; + case CALU8 : phseg->LAYER = ALU8; break; + case CALU9 : phseg->LAYER = ALU9; break; + } + } + } + else /* sinon on le duplique dans le metal associé pour qu'il absorbe + les vias inclus lors que la phase d'unification */ + { + phseg_list * phseg; + for (phseg = ((phfig_list *) Pt->DATA)->PHSEG; phseg; phseg=phseg->NEXT) + { + phseg_list * dupseg = addphseg((phfig_list *) Pt->DATA, + phseg->LAYER, phseg->WIDTH, + phseg->X1, phseg->Y1, + phseg->X2, phseg->Y2, + phseg->NAME); + switch (phseg->LAYER) + { + case CALU1 : dupseg->LAYER = ALU1; break; + case CALU2 : dupseg->LAYER = ALU2; break; + case CALU3 : dupseg->LAYER = ALU3; break; + case CALU4 : dupseg->LAYER = ALU4; break; + case CALU5 : dupseg->LAYER = ALU5; break; + case CALU6 : dupseg->LAYER = ALU6; break; + case CALU7 : dupseg->LAYER = ALU7; break; + case CALU8 : dupseg->LAYER = ALU8; break; + case CALU9 : dupseg->LAYER = ALU9; break; + } + dupseg->NAME = NULL; + } + } figmbkrds ((phfig_list *) Pt->DATA, 0, 0); + } } else {