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:
parent
942de34843
commit
b70258cfc9
|
@ -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 */
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue