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