Exemplo n.º 1
0
 public void setLayerGroup(CellLayerGroup layerGroup)
 {
     this.layerGroup = layerGroup;
 }
Exemplo n.º 2
0
        private CellLayerGroup createGroup(CellLayer cl)
        {
            CellLayerGroup layerGroup = new CellLayerGroup();

            if (cl.groupedIn == false) {
                layerGroup.layers.Add(cl);
                cl.groupedIn = true;
            }

            connectLayers(cl, layerGroup);

            return layerGroup;
        }
Exemplo n.º 3
0
        // cree récursivement les groupes de cellules en suivant les liens
        // FIXME : creer des liens dans l'éditeur pour trouver les portes
        // FIXME : ne pas grouper les layers silicon sous les portes !!
        private void groupAll(CellLayerGroup clg)
        {
            foreach (Cell c in clg.viaCells) {
                switch (clg.layers[0].layerType) {

                    case Cell.LayerType.SILICON_N:

                        if (c.layers[(int)Cell.LayerType.METAL].isSet
                            && c.layers[(int)Cell.LayerType.METAL].groupedIn == false) {

                            CellLayerGroup lg = createGroup(c.layers[(int)Cell.LayerType.METAL]);
                            c.layerGroup = lg;
                            LayerSubGroups.Add(lg);
                            groupAll(lg);
                        }
                        break;

                    case Cell.LayerType.SILICON_P:

                        if (c.layers[(int)Cell.LayerType.METAL].isSet
                            && c.layers[(int)Cell.LayerType.METAL].groupedIn == false) {

                            CellLayerGroup lg = createGroup(c.layers[(int)Cell.LayerType.METAL]);
                            c.layerGroup = lg;
                            LayerSubGroups.Add(lg);
                            groupAll(lg);
                        }
                        break;

                    case Cell.LayerType.METAL:

                        if (c.layers[(int)Cell.LayerType.SILICON_N].isSet
                            && c.layers[(int)Cell.LayerType.SILICON_N].groupedIn == false) {

                            CellLayerGroup lg = createGroup(c.layers[(int)Cell.LayerType.SILICON_N]);
                            c.layerGroup = lg;
                            LayerSubGroups.Add(lg);
                            groupAll(lg);
                        }

                        if (c.layers[(int)Cell.LayerType.SILICON_P].isSet
                            && c.layers[(int)Cell.LayerType.SILICON_P].groupedIn == false) {

                            CellLayerGroup lg = createGroup(c.layers[(int)Cell.LayerType.SILICON_P]);
                            c.layerGroup = lg;
                            LayerSubGroups.Add(lg);
                            groupAll(lg);
                        }
                        break;
                }
            }

            foreach (Cell c in subGates) {
                gates.Add(c);
            }

            Cell[] subGatesCopy = new Cell[subGates.Count];
            subGates.CopyTo(subGatesCopy);

            subGates = new List<Cell>();

            foreach (Cell c in subGatesCopy) {

                if (c.layers[(int)Cell.LayerType.NPN].isSet) {
                    foreach (Cell lnkC in c.layers[(int)Cell.LayerType.NPN].links) {

                        if (lnkC != null) {

                            if (lnkC.layers[(int)Cell.LayerType.SILICON_N].isSet
                                && lnkC.layers[(int)Cell.LayerType.SILICON_N].groupedIn == false
                                ) {

                                CellLayerGroup lg = createGroup(c.layers[(int)Cell.LayerType.SILICON_N]);
                                LayerSubGroups.Add(lg);
                                groupAll(lg);

                            } else if (lnkC.layers[(int)Cell.LayerType.SILICON_P].isSet
                                && lnkC.layers[(int)Cell.LayerType.SILICON_P].groupedIn == false
                                ) {

                                CellLayerGroup lg = createGroup(c.layers[(int)Cell.LayerType.SILICON_P]);
                                LayerSubGroups.Add(lg);
                                groupAll(lg);

                            }
                        }
                    }

                } else if (c.layers[(int)Cell.LayerType.PNP].isSet) {
                    foreach (Cell lnkC in c.layers[(int)Cell.LayerType.PNP].links) {
            //						if (lnkC.layers[(int)Cell.LayerType.SILICON_N].isSet
            //						    && lnkC.layers[(int)Cell.LayerType.SILICON_N].groupedIn == false
            //						    ) {
            //
            //							CellLayerGroup lg = createGroup(c.layers[(int)Cell.LayerType.SILICON_N]);
            //							LayerSubGroups.Add(lg);
            //							groupAll(lg);
            //
            //						} else if (lnkC.layers[(int)Cell.LayerType.SILICON_P].isSet
            //						           && lnkC.layers[(int)Cell.LayerType.SILICON_P].groupedIn == false
            //						    ) {
            //
            //							CellLayerGroup lg = createGroup(c.layers[(int)Cell.LayerType.SILICON_P]);
            //							LayerSubGroups.Add(lg);
            //							groupAll(lg);
            //
            //						}
                    }
                }
            }
        }
Exemplo n.º 4
0
        // ajoute récursivement les cellules dans un groupe
        private void connectLayers(CellLayer cl, CellLayerGroup layerGroup)
        {
            foreach (Cell c in cl.links) {

                // cellule existante encore non groupée. arrêt à la première porte
                if (c != null
                    && c.layers[(int)cl.layerType].groupedIn == false
                    && c.layers[(int)Cell.LayerType.NPN].isSet == false
                    && c.layers[(int)Cell.LayerType.PNP].isSet == false
                    ) {

                    layerGroup.layers.Add(c.layers[(int)cl.layerType]);
                    c.layers[(int)cl.layerType].groupedIn = true;
                    if (c.layers[(int)cl.layerType].parentCell.via)
                        layerGroup.viaCells.Add(c);
                    connectLayers(c.layers[(int)cl.layerType], layerGroup);
                }

                // ajout d'une porte à la liste de portes
                if (c != null) {

                    if (c.layers[(int)Cell.LayerType.NPN].isSet
                        && c.layers[(int)Cell.LayerType.NPN].groupedIn == false
                      	) {
                        c.layers[(int)Cell.LayerType.NPN].groupedIn = true;
                        subGates.Add(c);

                    } else if (c.layers[(int)Cell.LayerType.PNP].isSet
                                && c.layers[(int)Cell.LayerType.PNP].groupedIn == false
                               ) {
                        c.layers[(int)Cell.LayerType.PNP].groupedIn = true;
                        subGates.Add(c);
                    }
                }
            }
        }