1 ///////////////////////////////////////////////////////////////////////////////
2 // BSD 3-Clause License
3 //
4 // Copyright (c) 2019, Nefelus Inc
5 // All rights reserved.
6 //
7 // Redistribution and use in source and binary forms, with or without
8 // modification, are permitted provided that the following conditions are met:
9 //
10 // * Redistributions of source code must retain the above copyright notice, this
11 // list of conditions and the following disclaimer.
12 //
13 // * Redistributions in binary form must reproduce the above copyright notice,
14 // this list of conditions and the following disclaimer in the documentation
15 // and/or other materials provided with the distribution.
16 //
17 // * Neither the name of the copyright holder nor the names of its
18 // contributors may be used to endorse or promote products derived from
19 // this software without specific prior written permission.
20 //
21 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
25 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31 // POSSIBILITY OF SUCH DAMAGE.
32
33 #include "dbViaParams.h"
34
35 #include "db.h"
36 #include "dbDiff.h"
37
38 namespace odb {
39
40 ////////////////////////////////////////////////////////////////////
41 //
42 // _dbViaParams - Methods
43 //
44 ////////////////////////////////////////////////////////////////////
45
operator ==(const _dbViaParams & rhs) const46 bool _dbViaParams::operator==(const _dbViaParams& rhs) const
47 {
48 if (_x_cut_size != rhs._x_cut_size)
49 return false;
50
51 if (_y_cut_size != rhs._y_cut_size)
52 return false;
53
54 if (_x_cut_spacing != rhs._x_cut_spacing)
55 return false;
56
57 if (_y_cut_spacing != rhs._y_cut_spacing)
58 return false;
59
60 if (_x_top_enclosure != rhs._x_top_enclosure)
61 return false;
62
63 if (_y_top_enclosure != rhs._y_top_enclosure)
64 return false;
65
66 if (_x_bot_enclosure != rhs._x_bot_enclosure)
67 return false;
68
69 if (_y_bot_enclosure != rhs._y_bot_enclosure)
70 return false;
71
72 if (_num_cut_rows != rhs._num_cut_rows)
73 return false;
74
75 if (_num_cut_cols != rhs._num_cut_cols)
76 return false;
77
78 if (_x_origin != rhs._x_origin)
79 return false;
80
81 if (_y_origin != rhs._y_origin)
82 return false;
83
84 if (_x_top_offset != rhs._x_top_offset)
85 return false;
86
87 if (_y_top_offset != rhs._y_top_offset)
88 return false;
89
90 if (_x_bot_offset != rhs._x_bot_offset)
91 return false;
92
93 if (_y_bot_offset != rhs._y_bot_offset)
94 return false;
95
96 if (_top_layer != rhs._top_layer)
97 return false;
98
99 if (_cut_layer != rhs._cut_layer)
100 return false;
101
102 if (_bot_layer != rhs._bot_layer)
103 return false;
104
105 return true;
106 }
107
differences(dbDiff & diff,const char * field,const _dbViaParams & rhs) const108 void _dbViaParams::differences(dbDiff& diff,
109 const char* field,
110 const _dbViaParams& rhs) const
111 {
112 if (field)
113 diff.begin_object("<> %s\n", field);
114 else
115 diff.begin_object("<> _dbViaParams\n");
116
117 DIFF_FIELD(_x_cut_size);
118 DIFF_FIELD(_y_cut_size);
119 DIFF_FIELD(_x_cut_spacing);
120 DIFF_FIELD(_y_cut_spacing);
121 DIFF_FIELD(_x_top_enclosure);
122 DIFF_FIELD(_y_top_enclosure);
123 DIFF_FIELD(_x_bot_enclosure);
124 DIFF_FIELD(_y_bot_enclosure);
125 DIFF_FIELD(_num_cut_rows);
126 DIFF_FIELD(_num_cut_cols);
127 DIFF_FIELD(_x_origin);
128 DIFF_FIELD(_y_origin);
129 DIFF_FIELD(_x_top_offset);
130 DIFF_FIELD(_y_top_offset);
131 DIFF_FIELD(_x_bot_offset);
132 DIFF_FIELD(_y_bot_offset);
133 DIFF_FIELD(_top_layer);
134 DIFF_FIELD(_cut_layer);
135 DIFF_FIELD(_bot_layer);
136 diff.end_object();
137 }
138
out(dbDiff & diff,char side,const char * field) const139 void _dbViaParams::out(dbDiff& diff, char side, const char* field) const
140 {
141 if (field)
142 diff.begin_object("%c %s\n", side, field);
143 else
144 diff.begin_object("%c _dbViaParams\n", side);
145
146 DIFF_OUT_FIELD(_x_cut_size);
147 DIFF_OUT_FIELD(_y_cut_size);
148 DIFF_OUT_FIELD(_x_cut_spacing);
149 DIFF_OUT_FIELD(_y_cut_spacing);
150 DIFF_OUT_FIELD(_x_top_enclosure);
151 DIFF_OUT_FIELD(_y_top_enclosure);
152 DIFF_OUT_FIELD(_x_bot_enclosure);
153 DIFF_OUT_FIELD(_y_bot_enclosure);
154 DIFF_OUT_FIELD(_num_cut_rows);
155 DIFF_OUT_FIELD(_num_cut_cols);
156 DIFF_OUT_FIELD(_x_origin);
157 DIFF_OUT_FIELD(_y_origin);
158 DIFF_OUT_FIELD(_x_top_offset);
159 DIFF_OUT_FIELD(_y_top_offset);
160 DIFF_OUT_FIELD(_x_bot_offset);
161 DIFF_OUT_FIELD(_y_bot_offset);
162 DIFF_OUT_FIELD(_top_layer);
163 DIFF_OUT_FIELD(_cut_layer);
164 DIFF_OUT_FIELD(_bot_layer);
165 diff.end_object();
166 }
167
_dbViaParams(const _dbViaParams & v)168 _dbViaParams::_dbViaParams(const _dbViaParams& v)
169 : _x_cut_size(v._x_cut_size),
170 _y_cut_size(v._y_cut_size),
171 _x_cut_spacing(v._x_cut_spacing),
172 _y_cut_spacing(v._y_cut_spacing),
173 _x_top_enclosure(v._x_top_enclosure),
174 _y_top_enclosure(v._y_top_enclosure),
175 _x_bot_enclosure(v._x_bot_enclosure),
176 _y_bot_enclosure(v._y_bot_enclosure),
177 _num_cut_rows(v._num_cut_rows),
178 _num_cut_cols(v._num_cut_cols),
179 _x_origin(v._x_origin),
180 _y_origin(v._y_origin),
181 _x_top_offset(v._x_top_offset),
182 _y_top_offset(v._y_top_offset),
183 _x_bot_offset(v._x_bot_offset),
184 _y_bot_offset(v._y_bot_offset),
185 _top_layer(v._top_layer),
186 _cut_layer(v._cut_layer),
187 _bot_layer(v._bot_layer)
188 {
189 }
190
_dbViaParams()191 _dbViaParams::_dbViaParams()
192 {
193 _x_cut_size = 0;
194 _y_cut_size = 0;
195 _x_cut_spacing = 0;
196 _y_cut_spacing = 0;
197 _x_top_enclosure = 0;
198 _y_top_enclosure = 0;
199 _x_bot_enclosure = 0;
200 _y_bot_enclosure = 0;
201 _num_cut_rows = 1;
202 _num_cut_cols = 1;
203 _x_origin = 0;
204 _y_origin = 0;
205 _x_top_offset = 0;
206 _y_top_offset = 0;
207 _x_bot_offset = 0;
208 _y_bot_offset = 0;
209 }
210
~_dbViaParams()211 _dbViaParams::~_dbViaParams()
212 {
213 }
214
operator <<(dbOStream & stream,const _dbViaParams & v)215 dbOStream& operator<<(dbOStream& stream, const _dbViaParams& v)
216 {
217 stream << v._x_cut_size;
218 stream << v._y_cut_size;
219 stream << v._x_cut_spacing;
220 stream << v._y_cut_spacing;
221 stream << v._x_top_enclosure;
222 stream << v._y_top_enclosure;
223 stream << v._x_bot_enclosure;
224 stream << v._y_bot_enclosure;
225 stream << v._num_cut_rows;
226 stream << v._num_cut_cols;
227 stream << v._x_origin;
228 stream << v._y_origin;
229 stream << v._x_top_offset;
230 stream << v._y_top_offset;
231 stream << v._x_bot_offset;
232 stream << v._y_bot_offset;
233 stream << v._top_layer;
234 stream << v._cut_layer;
235 stream << v._bot_layer;
236 return stream;
237 }
238
operator >>(dbIStream & stream,_dbViaParams & v)239 dbIStream& operator>>(dbIStream& stream, _dbViaParams& v)
240 {
241 stream >> v._x_cut_size;
242 stream >> v._y_cut_size;
243 stream >> v._x_cut_spacing;
244 stream >> v._y_cut_spacing;
245 stream >> v._x_top_enclosure;
246 stream >> v._y_top_enclosure;
247 stream >> v._x_bot_enclosure;
248 stream >> v._y_bot_enclosure;
249 stream >> v._num_cut_rows;
250 stream >> v._num_cut_cols;
251 stream >> v._x_origin;
252 stream >> v._y_origin;
253 stream >> v._x_top_offset;
254 stream >> v._y_top_offset;
255 stream >> v._x_bot_offset;
256 stream >> v._y_bot_offset;
257 stream >> v._top_layer;
258 stream >> v._cut_layer;
259 stream >> v._bot_layer;
260 return stream;
261 }
262
263 ////////////////////////////////////////////////////////////////////
264 //
265 // dbViaParams - Methods
266 //
267 ////////////////////////////////////////////////////////////////////
268
dbViaParams()269 dbViaParams::dbViaParams() : _tech(NULL)
270 {
271 }
272
dbViaParams(const dbViaParams & p)273 dbViaParams::dbViaParams(const dbViaParams& p) : _dbViaParams(p), _tech(p._tech)
274 {
275 }
276
dbViaParams(const _dbViaParams & p)277 dbViaParams::dbViaParams(const _dbViaParams& p) : _dbViaParams(p), _tech(NULL)
278 {
279 }
280
~dbViaParams()281 dbViaParams::~dbViaParams()
282 {
283 }
284
getXCutSize() const285 int dbViaParams::getXCutSize() const
286 {
287 return _x_cut_size;
288 }
289
getYCutSize() const290 int dbViaParams::getYCutSize() const
291 {
292 return _y_cut_size;
293 }
294
getXCutSpacing() const295 int dbViaParams::getXCutSpacing() const
296 {
297 return _x_cut_spacing;
298 }
299
getYCutSpacing() const300 int dbViaParams::getYCutSpacing() const
301 {
302 return _y_cut_spacing;
303 }
304
getXTopEnclosure() const305 int dbViaParams::getXTopEnclosure() const
306 {
307 return _x_top_enclosure;
308 }
309
getYTopEnclosure() const310 int dbViaParams::getYTopEnclosure() const
311 {
312 return _y_top_enclosure;
313 }
314
getXBottomEnclosure() const315 int dbViaParams::getXBottomEnclosure() const
316 {
317 return _x_bot_enclosure;
318 }
319
getYBottomEnclosure() const320 int dbViaParams::getYBottomEnclosure() const
321 {
322 return _y_bot_enclosure;
323 }
324
getNumCutRows() const325 int dbViaParams::getNumCutRows() const
326 {
327 return _num_cut_rows;
328 }
329
getNumCutCols() const330 int dbViaParams::getNumCutCols() const
331 {
332 return _num_cut_cols;
333 }
334
getXOrigin() const335 int dbViaParams::getXOrigin() const
336 {
337 return _x_origin;
338 }
339
getYOrigin() const340 int dbViaParams::getYOrigin() const
341 {
342 return _y_origin;
343 }
344
getXTopOffset() const345 int dbViaParams::getXTopOffset() const
346 {
347 return _x_top_offset;
348 }
349
getYTopOffset() const350 int dbViaParams::getYTopOffset() const
351 {
352 return _y_top_offset;
353 }
354
getXBottomOffset() const355 int dbViaParams::getXBottomOffset() const
356 {
357 return _x_bot_offset;
358 }
359
getYBottomOffset() const360 int dbViaParams::getYBottomOffset() const
361 {
362 return _y_bot_offset;
363 }
364
getTopLayer() const365 dbTechLayer* dbViaParams::getTopLayer() const
366 {
367 if (_tech == NULL)
368 return NULL;
369
370 return dbTechLayer::getTechLayer(_tech, _top_layer);
371 }
372
getCutLayer() const373 dbTechLayer* dbViaParams::getCutLayer() const
374 {
375 if (_tech == NULL)
376 return NULL;
377
378 return dbTechLayer::getTechLayer(_tech, _cut_layer);
379 }
380
getBottomLayer() const381 dbTechLayer* dbViaParams::getBottomLayer() const
382 {
383 if (_tech == NULL)
384 return NULL;
385
386 return dbTechLayer::getTechLayer(_tech, _bot_layer);
387 }
388
setXCutSize(int value)389 void dbViaParams::setXCutSize(int value)
390 {
391 _x_cut_size = value;
392 }
393
setYCutSize(int value)394 void dbViaParams::setYCutSize(int value)
395 {
396 _y_cut_size = value;
397 }
398
setXCutSpacing(int value)399 void dbViaParams::setXCutSpacing(int value)
400 {
401 _x_cut_spacing = value;
402 }
403
setYCutSpacing(int value)404 void dbViaParams::setYCutSpacing(int value)
405 {
406 _y_cut_spacing = value;
407 }
408
setXTopEnclosure(int value)409 void dbViaParams::setXTopEnclosure(int value)
410 {
411 _x_top_enclosure = value;
412 }
413
setYTopEnclosure(int value)414 void dbViaParams::setYTopEnclosure(int value)
415 {
416 _y_top_enclosure = value;
417 }
418
setXBottomEnclosure(int value)419 void dbViaParams::setXBottomEnclosure(int value)
420 {
421 _x_bot_enclosure = value;
422 }
423
setYBottomEnclosure(int value)424 void dbViaParams::setYBottomEnclosure(int value)
425 {
426 _y_bot_enclosure = value;
427 }
428
setNumCutRows(int value)429 void dbViaParams::setNumCutRows(int value)
430 {
431 _num_cut_rows = value;
432 }
433
setNumCutCols(int value)434 void dbViaParams::setNumCutCols(int value)
435 {
436 _num_cut_cols = value;
437 }
438
setXOrigin(int value)439 void dbViaParams::setXOrigin(int value)
440 {
441 _x_origin = value;
442 }
443
setYOrigin(int value)444 void dbViaParams::setYOrigin(int value)
445 {
446 _y_origin = value;
447 }
448
setXTopOffset(int value)449 void dbViaParams::setXTopOffset(int value)
450 {
451 _x_top_offset = value;
452 }
453
setYTopOffset(int value)454 void dbViaParams::setYTopOffset(int value)
455 {
456 _y_top_offset = value;
457 }
458
setXBottomOffset(int value)459 void dbViaParams::setXBottomOffset(int value)
460 {
461 _x_bot_offset = value;
462 }
463
setYBottomOffset(int value)464 void dbViaParams::setYBottomOffset(int value)
465 {
466 _y_bot_offset = value;
467 }
468
setTopLayer(dbTechLayer * layer)469 void dbViaParams::setTopLayer(dbTechLayer* layer)
470 {
471 if (_tech == NULL)
472 _tech = layer->getTech();
473
474 assert(_tech == layer->getTech());
475 _top_layer = layer->getId();
476 }
477
setCutLayer(dbTechLayer * layer)478 void dbViaParams::setCutLayer(dbTechLayer* layer)
479 {
480 if (_tech == NULL)
481 _tech = layer->getTech();
482
483 assert(_tech == layer->getTech());
484 _cut_layer = layer->getId();
485 }
486
setBottomLayer(dbTechLayer * layer)487 void dbViaParams::setBottomLayer(dbTechLayer* layer)
488 {
489 if (_tech == NULL)
490 _tech = layer->getTech();
491
492 assert(_tech == layer->getTech());
493 _bot_layer = layer->getId();
494 }
495
496 } // namespace odb
497