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');
|
mbk_model = getphfig (source_name, 'A');
|
||||||
if (!root_conn)
|
if (!root_conn)
|
||||||
mbk_model->PHCON = NULL;
|
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 */
|
/* Removing symbolic data structure */
|
||||||
|
|
||||||
|
|
|
@ -932,21 +932,16 @@ static void addpwell (model, verbose)
|
||||||
{
|
{
|
||||||
rdsrec_list *rectab = model->LAYERTAB[RDS_ABOX];
|
rdsrec_list *rectab = model->LAYERTAB[RDS_ABOX];
|
||||||
int f = MBK_SEGMENT_MASK | RDS_FIG_REC_MASK;
|
int f = MBK_SEGMENT_MASK | RDS_FIG_REC_MASK;
|
||||||
|
|
||||||
long qty = GET_S2R_OVERSIZE (RDS_NIMP);
|
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);
|
cutcut (model, RDS_PWELL, RDS_NWELL);
|
||||||
|
|
||||||
qty = GET_S2R_OVERSIZE (RDS_NIMP);
|
// on recalcule de NWELL a partir du PWELL
|
||||||
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);
|
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_USER9, RDS_PWELL);
|
cutcut (model, RDS_NWELL, 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];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -966,12 +961,20 @@ static void addimp (model, verbose)
|
||||||
|
|
||||||
if (model->INSTANCE == NULL && model->LAYERTAB[RDS_NWELL] != NULL)
|
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)
|
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);
|
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)
|
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);
|
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);
|
cutcut (model, RDS_NIMP, RDS_PTIE);
|
||||||
|
if (model->LAYERTAB[RDS_PIMP] != NULL)
|
||||||
cutcut (model, RDS_PIMP, RDS_NTIE);
|
cutcut (model, RDS_PIMP, RDS_NTIE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -561,13 +561,39 @@ static chain_list *make_model_list (fig)
|
||||||
| Transform a hierarchy Mbk -> Rds |
|
| Transform a hierarchy Mbk -> Rds |
|
||||||
\------------------------------------------------------*/
|
\------------------------------------------------------*/
|
||||||
|
|
||||||
rdsfig_list *S2Rfigmbkrds (FigureMbk, All)
|
rdsfig_list *S2Rfigmbkrds (FigureMbk, All,SubConn)
|
||||||
phfig_list *FigureMbk;
|
phfig_list *FigureMbk;
|
||||||
char All;
|
char All;
|
||||||
|
char SubConn;
|
||||||
{
|
{
|
||||||
rdsfig_list *FigureRds;
|
rdsfig_list *FigureRds;
|
||||||
chain_list *Pt;
|
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)
|
if (All)
|
||||||
{
|
{
|
||||||
Pt = make_model_list (FigureMbk);
|
Pt = make_model_list (FigureMbk);
|
||||||
|
@ -587,8 +613,56 @@ rdsfig_list *S2Rfigmbkrds (FigureMbk, All)
|
||||||
|
|
||||||
FigureRds = figmbkrds ((phfig_list *) Pt->DATA, 0, 0);
|
FigureRds = figmbkrds ((phfig_list *) Pt->DATA, 0, 0);
|
||||||
for (Pt = Pt->NEXT; Pt != NULL; Pt = Pt->NEXT)
|
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);
|
figmbkrds ((phfig_list *) Pt->DATA, 0, 0);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
FigureRds = figmbkrds (FigureMbk, 0, 0);
|
FigureRds = figmbkrds (FigureMbk, 0, 0);
|
||||||
|
|
Loading…
Reference in New Issue