changement de version

changement de strategie pour la génération des NWELL, PWELL, NIMP, PIMP

 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
This commit is contained in:
Franck Wajsburt 2002-06-04 14:08:21 +00:00
parent 942de34843
commit b70258cfc9
3 changed files with 95 additions and 18 deletions

View File

@ -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 */

View File

@ -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,12 +961,20 @@ 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);
if (model->LAYERTAB[RDS_NIMP] != NULL)
cutcut (model, RDS_NIMP, RDS_PTIE);
if (model->LAYERTAB[RDS_PIMP] != NULL)
cutcut (model, RDS_PIMP, RDS_NTIE);
}
}

View File

@ -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,8 +613,56 @@ 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
{
FigureRds = figmbkrds (FigureMbk, 0, 0);