Example #1
0
        public Layer(LayerTemplate template)
        {
            _isLockCheckEnabled = false;

            Template = template;
            Width    = template.Width;
            Height   = template.Height;

            void BuildPin(Position pos, int width, int height)
            {
                for (var i = 0; i < width; i++)
                {
                    for (var j = 0; j < height; j++)
                    {
                        AddCellMetal(pos.Offset(i, j));
                    }
                }

                for (var i = 0; i < width - 1; i++)
                {
                    for (var j = 0; j < height - 1; j++)
                    {
                        AddLink(pos.Offset(i, j), pos.Offset(i + 1, j), LinkType.MetalLink);
                        AddLink(pos.Offset(i, j), pos.Offset(i, j + 1), LinkType.MetalLink);
                    }
                }

                for (var i = 0; i < width; i++)
                {
                    AddLink(pos.Offset(i, height - 1), pos.Offset(i + 1, height - 1), LinkType.MetalLink);
                }
                for (var i = 0; i < height; i++)
                {
                    AddLink(pos.Offset(width - 1, i), pos.Offset(width - 1, i + 1), LinkType.MetalLink);
                }
            }

            _cellMatrix = new LayerCellMatrix(this);

            foreach (var pin in template.Pins)
            {
                var pos = new Position(pin.Col, pin.Row);
                BuildPin(pos, pin.Width, pin.Height);
                SetCellPin(pos, pin);
            }

            CommitChanges(false);

            _isLockCheckEnabled = true;
        }
Example #2
0
        public Layer(SavedLayer savedLayer) : this(savedLayer.Template)
        {
            var layerData = savedLayer.Data;

            // todo: verification
            var height = layerData.Cells.GetLength(0);
            var width  = layerData.Cells.GetLength(1);

            if (width != Template.Width || height != Template.Height)
            {
                throw new ArgumentException();
            }

            if (layerData.RightLinks.GetLength(0) != height || layerData.RightLinks.GetLength(1) != width)
            {
                throw new ArgumentException();
            }
            if (layerData.BottomLinks.GetLength(0) != height || layerData.BottomLinks.GetLength(1) != width)
            {
                throw new ArgumentException();
            }

            Width  = width;
            Height = height;

            _cellMatrix = new LayerCellMatrix(this);
            for (var i = 0; i < height; i++)
            {
                for (var j = 0; j < width; j++)
                {
                    _cellMatrix.UpdateCellContent(new Position(j, i), layerData.Cells[i, j]);
                    _cellMatrix.UpdateLinkContent(new Position(j, i), Side.Right, layerData.RightLinks[i, j]);
                    _cellMatrix.UpdateLinkContent(new Position(j, i), Side.Bottom, layerData.BottomLinks[i, j]);
                }
            }

            CommitChanges(false);
        }