Skip to content

Commit 45fdaf0

Browse files
Merge pull request #2049 from KLayout/devel
Devel
2 parents 3ce5067 + 2a9acd1 commit 45fdaf0

File tree

109 files changed

+914
-324
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

109 files changed

+914
-324
lines changed

src/db/db/dbCellVariants.cc

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -712,6 +712,28 @@ VariantsCollectorBase::create_var_instances_tl_invariant (db::Cell &in_cell, std
712712

713713
// ------------------------------------------------------------------------------------------
714714

715+
TransformationReducer *
716+
make_reducer (ReducerType type)
717+
{
718+
719+
switch (type) {
720+
case Orientation:
721+
return new OrientationReducer ();
722+
case Orthogonal:
723+
return new OrthogonalTransformationReducer ();
724+
case Magnification:
725+
return new MagnificationReducer ();
726+
case XYAnisotropyAndMagnification:
727+
return new XYAnisotropyAndMagnificationReducer ();
728+
case MagnificationAndOrientation:
729+
return new MagnificationAndOrientationReducer ();
730+
default:
731+
return 0;
732+
}
733+
}
734+
735+
// ------------------------------------------------------------------------------------------
736+
715737
VariantStatistics::VariantStatistics ()
716738
: mp_red ()
717739
{

src/db/db/dbCellVariants.h

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,51 @@ struct DB_PUBLIC ScaleAndGridReducer
166166
int64_t m_grid;
167167
};
168168

169+
/**
170+
* @brief An enum describing a reducer type
171+
*
172+
* This enum is used to create a generic reducer (parameterless) from the code.
173+
*/
174+
enum ReducerType
175+
{
176+
/**
177+
* @brief No specific reducer
178+
*/
179+
NoReducer = 0,
180+
181+
/**
182+
* @brief Rotation/mirror variants
183+
*/
184+
Orientation = 1,
185+
186+
/**
187+
* @brief Orthogonal transformations (rotations of multiple of 90 degree) variants
188+
*/
189+
Orthogonal = 2,
190+
191+
/**
192+
* @brief Scaling variants
193+
*/
194+
Magnification = 3,
195+
196+
/**
197+
* @brief Scaling and x/y assymmetry variants (i.e. anisotropic size)
198+
*/
199+
XYAnisotropyAndMagnification = 4,
200+
201+
/**
202+
* @brief Scaling and orientation variants
203+
*/
204+
MagnificationAndOrientation = 5
205+
};
206+
207+
/**
208+
* @brief Creates a TransformationReducer from the type enum
209+
*
210+
* This function returns 0 if the type is NoReducer or invalid.
211+
*/
212+
DB_PUBLIC TransformationReducer *make_reducer (ReducerType type);
213+
169214
/**
170215
* @brief A class computing variants for cells according to a given criterion
171216
*

src/db/db/dbCompoundOperation.cc

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,7 @@ CompoundTransformationReducer::is_translation_invariant () const
302302

303303
// ---------------------------------------------------------------------------------------------
304304

305-
CompoundRegionMultiInputOperationNode::CompoundRegionMultiInputOperationNode (const std::vector<CompoundRegionOperationNode *> &children)
305+
CompoundRegionMultiInputOperationNode::CompoundRegionMultiInputOperationNode (const std::vector<CompoundRegionOperationNode *> &children, bool no_init)
306306
{
307307
for (std::vector<CompoundRegionOperationNode *>::const_iterator c = children.begin (); c != children.end (); ++c) {
308308
(*c)->keep ();
@@ -362,6 +362,11 @@ CompoundRegionMultiInputOperationNode::init ()
362362
for (tl::shared_collection<CompoundRegionOperationNode>::iterator i = m_children.begin (); i != m_children.end (); ++i) {
363363
m_vars.add (i->vars ());
364364
}
365+
366+
// add the local variant reducer
367+
if (local_vars ()) {
368+
m_vars.add (local_vars ());
369+
}
365370
}
366371

367372
CompoundRegionMultiInputOperationNode::~CompoundRegionMultiInputOperationNode ()

src/db/db/dbCompoundOperation.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -453,7 +453,7 @@ class DB_PUBLIC CompoundRegionMultiInputOperationNode
453453
: public CompoundRegionOperationNode
454454
{
455455
public:
456-
CompoundRegionMultiInputOperationNode (const std::vector<CompoundRegionOperationNode *> &children);
456+
CompoundRegionMultiInputOperationNode (const std::vector<CompoundRegionOperationNode *> &children, bool no_init = false);
457457
CompoundRegionMultiInputOperationNode ();
458458
CompoundRegionMultiInputOperationNode (CompoundRegionOperationNode *child);
459459
CompoundRegionMultiInputOperationNode (CompoundRegionOperationNode *a, CompoundRegionOperationNode *b);
@@ -521,14 +521,16 @@ class DB_PUBLIC CompoundRegionMultiInputOperationNode
521521
CompoundRegionOperationNode *child (unsigned int index);
522522
const CompoundRegionOperationNode *child (unsigned int index) const;
523523

524+
virtual const TransformationReducer *local_vars () const { return 0; }
525+
526+
void init ();
527+
524528
private:
525529
tl::shared_collection<CompoundRegionOperationNode> m_children;
526530
// maps child#,layer# to layer# of child:
527531
std::map<std::pair<unsigned int, unsigned int>, unsigned int> m_map_layer_to_child;
528532
std::vector<db::Region *> m_inputs;
529533
CompoundTransformationReducer m_vars;
530-
531-
void init ();
532534
};
533535

534536

src/db/db/dbLayoutToNetlistWriter.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -692,6 +692,8 @@ void std_writer_impl<Keys>::write (TokenizedOutput &stream, const db::Net &net,
692692
*outp << tl::to_string (id);
693693
if (! net.name ().empty ()) {
694694
TokenizedOutput (*outp, Keys::name_key, true) << tl::to_word_or_quoted_string (net.name ());
695+
} else if (net.id () != id) {
696+
TokenizedOutput (*outp, Keys::name_key, true) << tl::to_word_or_quoted_string (net.expanded_name ());
695697
}
696698

697699
*outp << endl;

src/db/db/dbNetlistCrossReference.cc

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,24 @@ NetlistCrossReference::other_net_for (const db::Net *net) const
111111
}
112112
}
113113

114+
const NetlistCrossReference::PerNetData *
115+
NetlistCrossReference::per_net_data_for_net (const db::Net *net) const
116+
{
117+
const db::Net *other_net = other_net_for (net);
118+
119+
std::map<std::pair<const db::Net *, const db::Net *>, PerNetData>::iterator i = m_per_net_data.find (std::make_pair (net, other_net));
120+
if (i == m_per_net_data.end ()) {
121+
i = m_per_net_data.find (std::make_pair (other_net, net));
122+
}
123+
124+
if (i == m_per_net_data.end ()) {
125+
static const NetlistCrossReference::PerNetData empty_net_data;
126+
return &empty_net_data;
127+
} else {
128+
return &i->second;
129+
}
130+
}
131+
114132
const NetlistCrossReference::PerNetData *
115133
NetlistCrossReference::per_net_data_for (const std::pair<const db::Net *, const db::Net *> &nets) const
116134
{

src/db/db/dbNetlistCrossReference.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,7 @@ class DB_PUBLIC NetlistCrossReference
280280
const db::SubCircuit *other_subcircuit_for (const db::SubCircuit *subcircuit) const;
281281
const db::Circuit *other_circuit_for (const db::Circuit *circuit) const;
282282
const db::Net *other_net_for (const db::Net *net) const;
283+
const PerNetData *per_net_data_for_net (const db::Net *net) const;
283284
const PerNetData *per_net_data_for (const std::pair<const db::Net *, const db::Net *> &nets) const;
284285

285286
const db::Netlist *netlist_a () const

src/db/db/dbPolygonNeighborhood.cc

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,38 +28,42 @@ namespace db
2828
{
2929

3030
PolygonNeighborhoodVisitor::PolygonNeighborhoodVisitor ()
31-
: m_result_type (db::CompoundRegionOperationNode::ResultType::Edges)
31+
: m_result_type (db::CompoundRegionOperationNode::ResultType::Edges), m_variant_type (db::NoReducer)
3232
{
3333
disconnect_outputs ();
3434
}
3535

3636
void
37-
PolygonNeighborhoodVisitor::connect_output (Layout * /*layout*/, std::unordered_set<db::PolygonWithProperties> *polygons) const
37+
PolygonNeighborhoodVisitor::connect_output (Layout * /*layout*/, std::unordered_set<db::PolygonWithProperties> *polygons, const db::ICplxTrans &trans) const
3838
{
3939
disconnect_outputs ();
4040
mp_polygons = polygons;
41+
m_trans = trans;
4142
}
4243

4344
void
44-
PolygonNeighborhoodVisitor::connect_output (db::Layout *layout, std::unordered_set<db::PolygonRefWithProperties> *polygons) const
45+
PolygonNeighborhoodVisitor::connect_output (db::Layout *layout, std::unordered_set<db::PolygonRefWithProperties> *polygons, const db::ICplxTrans &trans) const
4546
{
4647
disconnect_outputs ();
4748
mp_layout = layout;
4849
mp_polygon_refs = polygons;
50+
m_trans = trans;
4951
}
5052

5153
void
52-
PolygonNeighborhoodVisitor::connect_output (db::Layout * /*layout*/, std::unordered_set<db::EdgeWithProperties> *edges) const
54+
PolygonNeighborhoodVisitor::connect_output (db::Layout * /*layout*/, std::unordered_set<db::EdgeWithProperties> *edges, const db::ICplxTrans &trans) const
5355
{
5456
disconnect_outputs ();
5557
mp_edges = edges;
58+
m_trans = trans;
5659
}
5760

5861
void
59-
PolygonNeighborhoodVisitor::connect_output (Layout * /*layout*/, std::unordered_set<db::EdgePairWithProperties> *edge_pairs) const
62+
PolygonNeighborhoodVisitor::connect_output (Layout * /*layout*/, std::unordered_set<db::EdgePairWithProperties> *edge_pairs, const db::ICplxTrans &trans) const
6063
{
6164
disconnect_outputs ();
6265
mp_edge_pairs = edge_pairs;
66+
m_trans = trans;
6367
}
6468

6569
void
@@ -76,10 +80,10 @@ void
7680
PolygonNeighborhoodVisitor::output_polygon (const db::PolygonWithProperties &poly)
7781
{
7882
if (mp_polygons) {
79-
mp_polygons->insert (poly);
83+
mp_polygons->insert (poly.transformed (m_trans));
8084
} else if (mp_polygon_refs) {
8185
tl_assert (mp_layout != 0);
82-
mp_polygon_refs->insert (db::PolygonRefWithProperties (db::PolygonRef (poly, mp_layout->shape_repository ()), poly.properties_id ()));
86+
mp_polygon_refs->insert (db::PolygonRefWithProperties (db::PolygonRef (poly.transformed (m_trans), mp_layout->shape_repository ()), poly.properties_id ()));
8387
} else {
8488
throw tl::Exception (tl::to_string (tr ("PolygonNeighborhoodVisitor is not configured for edge output (use 'result_type=Edges')")));
8589
}
@@ -91,7 +95,7 @@ PolygonNeighborhoodVisitor::output_edge (const db::EdgeWithProperties &edge)
9195
if (mp_edges == 0) {
9296
throw tl::Exception (tl::to_string (tr ("PolygonNeighborhoodVisitor is not configured for edge output (use 'result_type=Edges')")));
9397
}
94-
mp_edges->insert (edge);
98+
mp_edges->insert (edge.transformed (m_trans));
9599
}
96100

97101
void
@@ -100,16 +104,22 @@ PolygonNeighborhoodVisitor::output_edge_pair (const db::EdgePairWithProperties &
100104
if (mp_edge_pairs == 0) {
101105
throw tl::Exception (tl::to_string (tr ("PolygonNeighborhoodVisitor is not configured for edge pair output (use 'result_type=EdgePairs')")));
102106
}
103-
mp_edge_pairs->insert (edge_pair);
107+
mp_edge_pairs->insert (edge_pair.transformed (m_trans));
104108
}
105109

106110
// --------------------------------------------------------------------------------------------------
107111

108112
PolygonNeighborhoodCompoundOperationNode::PolygonNeighborhoodCompoundOperationNode (const std::vector<CompoundRegionOperationNode *> &children, PolygonNeighborhoodVisitor *visitor, db::Coord dist)
109-
: CompoundRegionMultiInputOperationNode (children), m_dist (dist), mp_visitor (visitor)
113+
: CompoundRegionMultiInputOperationNode (children, true /*no implicit init()*/),
114+
m_dist (dist), mp_visitor (visitor)
110115
{
111116
tl_assert (visitor != 0);
112117
visitor->keep ();
118+
119+
m_vars.reset (db::make_reducer (visitor->variant_type ()));
120+
121+
// must be called after local_vars() is available
122+
init ();
113123
}
114124

115125
db::Coord
@@ -170,12 +180,19 @@ PolygonNeighborhoodCompoundOperationNode::compute_local_impl (CompoundRegionOper
170180
tl_assert (interactions.num_subjects () == 1);
171181
tl_assert (! results.empty ());
172182

183+
db::ICplxTrans var_trans, var_trans_inv;
184+
if (proc->vars ()) {
185+
var_trans_inv = proc->vars ()->single_variant_transformation (cell->cell_index ());
186+
var_trans = var_trans_inv.inverted ();
187+
}
188+
173189
try {
174190

175-
mp_visitor->connect_output (layout, &results.front ());
191+
mp_visitor->connect_output (layout, &results.front (), var_trans_inv);
176192

177193
const T &pr = interactions.begin_subjects ()->second;
178194
db::PolygonWithProperties subject (pr.instantiate (), pr.properties_id ());
195+
subject.transform (var_trans);
179196

180197
PolygonNeighborhoodVisitor::neighbors_type neighbors;
181198

@@ -191,6 +208,7 @@ PolygonNeighborhoodCompoundOperationNode::compute_local_impl (CompoundRegionOper
191208

192209
for (auto p = others.front ().begin (); p != others.front ().end (); ++p) {
193210
n.push_back (db::PolygonWithProperties (p->instantiate (), p->properties_id ()));
211+
n.back ().transform (var_trans);
194212
}
195213

196214
}

src/db/db/dbPolygonNeighborhood.h

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,22 +58,22 @@ class DB_PUBLIC PolygonNeighborhoodVisitor
5858
/**
5959
* @brief Configure the polygon output
6060
*/
61-
void connect_output (db::Layout * /*layout*/, std::unordered_set<db::PolygonWithProperties> *polygons) const;
61+
void connect_output (db::Layout * /*layout*/, std::unordered_set<db::PolygonWithProperties> *polygons, const db::ICplxTrans &trans) const;
6262

6363
/**
6464
* @brief Configure the polygon ref output
6565
*/
66-
void connect_output (db::Layout *layout, std::unordered_set<db::PolygonRefWithProperties> *polygons) const;
66+
void connect_output (db::Layout *layout, std::unordered_set<db::PolygonRefWithProperties> *polygons, const db::ICplxTrans &trans) const;
6767

6868
/**
6969
* @brief Configure the edge output
7070
*/
71-
void connect_output (db::Layout * /*layout*/, std::unordered_set<db::EdgeWithProperties> *edges) const;
71+
void connect_output (db::Layout * /*layout*/, std::unordered_set<db::EdgeWithProperties> *edges, const db::ICplxTrans &trans) const;
7272

7373
/**
7474
* @brief Configure the edge pair output
7575
*/
76-
void connect_output (db::Layout * /*layout*/, std::unordered_set<db::EdgePairWithProperties> *edge_pairs) const;
76+
void connect_output (db::Layout * /*layout*/, std::unordered_set<db::EdgePairWithProperties> *edge_pairs, const db::ICplxTrans &trans) const;
7777

7878
/**
7979
* @brief Disconnects output
@@ -102,6 +102,22 @@ class DB_PUBLIC PolygonNeighborhoodVisitor
102102
return m_result_type;
103103
}
104104

105+
/**
106+
* @brief Sets the variant type
107+
*/
108+
void set_variant_type (db::ReducerType variant_type)
109+
{
110+
m_variant_type = variant_type;
111+
}
112+
113+
/**
114+
* @brief Gets the variant type
115+
*/
116+
db::ReducerType variant_type () const
117+
{
118+
return m_variant_type;
119+
}
120+
105121
/**
106122
* @brief Delivers a polygon
107123
* This function is only permitted if the result type is Region.
@@ -122,11 +138,13 @@ class DB_PUBLIC PolygonNeighborhoodVisitor
122138

123139
private:
124140
db::CompoundRegionOperationNode::ResultType m_result_type;
141+
db::ReducerType m_variant_type;
125142
mutable std::unordered_set<db::PolygonWithProperties> *mp_polygons;
126143
mutable std::unordered_set<db::PolygonRefWithProperties> *mp_polygon_refs;
127144
mutable std::unordered_set<db::EdgeWithProperties> *mp_edges;
128145
mutable std::unordered_set<db::EdgePairWithProperties> *mp_edge_pairs;
129146
mutable db::Layout *mp_layout;
147+
mutable db::ICplxTrans m_trans;
130148
};
131149

132150
/**
@@ -148,6 +166,11 @@ class DB_PUBLIC PolygonNeighborhoodCompoundOperationNode
148166
return false;
149167
}
150168

169+
virtual const TransformationReducer *local_vars () const
170+
{
171+
return m_vars.get ();
172+
}
173+
151174
protected:
152175
virtual db::Coord computed_dist () const;
153176
virtual std::string generated_description () const;
@@ -162,6 +185,7 @@ class DB_PUBLIC PolygonNeighborhoodCompoundOperationNode
162185
private:
163186
db::Coord m_dist;
164187
tl::weak_ptr<PolygonNeighborhoodVisitor> mp_visitor;
188+
std::unique_ptr<db::TransformationReducer> m_vars;
165189

166190
template <class T, class TR>
167191
void compute_local_impl (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, db::Cell * /*cell*/, const shape_interactions<T, T> & /*interactions*/, std::vector<std::unordered_set<TR> > & /*results*/, const db::LocalProcessorBase * /*proc*/) const;

0 commit comments

Comments
 (0)