iEDA/src/operation/iDRC/source/data/basic/DrcPoly.hpp

85 lines
2.8 KiB
C++

// ***************************************************************************************
// Copyright (c) 2023-2025 Peng Cheng Laboratory
// Copyright (c) 2023-2025 Institute of Computing Technology, Chinese Academy of Sciences
// Copyright (c) 2023-2025 Beijing Institute of Open Source Chip
//
// iEDA is licensed under Mulan PSL v2.
// You can use this software according to the terms and conditions of the Mulan PSL v2.
// You may obtain a copy of Mulan PSL v2 at:
// http://license.coscl.org.cn/MulanPSL2
//
// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
// EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
// MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
//
// See the Mulan PSL v2 for more details.
// ***************************************************************************************
#pragma once
#include <vector>
#include "DrcCorner.hpp"
#include "DrcNet.h"
#include "DrcPolygon.h"
namespace idrc {
class DrcNet;
class DrcPolygon;
class DrcPoly
{
public:
DrcPoly() : _layer_id(-1), _net_id(-1), _polygon(nullptr), _net(nullptr) /*, dirty(false)*/, _edges(), _corners(), _max_rects() {}
DrcPoly(const PolygonWithHoles& shape_in, int layer_num_in, DrcNet* net_in)
: _layer_id(-1),
_net_id(-1),
_polygon(std::make_unique<DrcPolygon>(shape_in, layer_num_in, this, net_in).get()),
_net(net_in) /*, dirty(true)*/,
_edges(),
_corners(),
_max_rects()
{
}
DrcPoly(const PolygonWithHoles& shape_in, int layer_num_in, int net_id)
: _layer_id(-1),
_net_id(net_id),
_polygon(std::make_unique<DrcPolygon>(shape_in, layer_num_in, this, net_id).get()),
_net(nullptr),
_edges(),
_corners(),
_max_rects()
{
}
int get_layer_id() const { return _layer_id; }
DrcPolygon* getPolygon() const { return _polygon; }
DrcNet* getNet() const { return _net; }
int getNetId() const { return _net_id; }
std::set<DrcRect*>& getScopes() { return _scope_set; }
std::vector<std::vector<std::unique_ptr<DrcEdge>>>& getEdges() { return _edges; }
void setNet(DrcNet* in) { _net = in; }
void setNetId(int net_id) { _net_id = net_id; }
void setPolygon(DrcPolygon* in) { _polygon = in; }
void set_layer_id(int in) { _layer_id = in; }
void addScope(DrcRect* scope_rect) { _scope_set.insert(scope_rect); }
void addEdges(std::vector<std::unique_ptr<DrcEdge>>& in) { _edges.push_back(std::move(in)); }
void addCorners(std::vector<std::unique_ptr<DrcCorner>>& in) { _corners.push_back(std::move(in)); }
private:
int _layer_id;
int _net_id;
DrcPolygon* _polygon;
DrcNet* _net;
std::vector<std::vector<std::unique_ptr<DrcEdge>>> _edges;
std::vector<std::vector<std::unique_ptr<DrcCorner>>> _corners;
std::set<DrcRect*> _scope_set;
std::vector<DrcRect*> _max_rects;
};
} // namespace idrc