1 /* Authors: Lutong Wang and Bangqi Xu */
2 /*
3 * Copyright (c) 2019, The Regents of the University of California
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are met:
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * * Neither the name of the University nor the
14 * names of its contributors may be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS BE LIABLE FOR ANY DIRECT,
21 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29 #include "db/taObj/taTrack.h"
30
31 #include "db/taObj/taFig.h"
32 #include "db/taObj/taPin.h"
33 #include "frDesign.h"
34
35 using namespace std;
36 using namespace fr;
37
38 // for pathseg, return overlapped length * #overlaps per interval
39 // for via, return #overlaps
getCost(frCoord x1,frCoord x2,int type,taPinFig * fig) const40 frUInt4 taTrack::getCost(frCoord x1, frCoord x2, int type, taPinFig* fig) const
41 {
42 frUInt4 cost = 0;
43 decltype(costPlanar_.equal_range(
44 boost::icl::interval<frCoord>::closed(x1, x2))) itRes;
45 switch (type) {
46 case 0:
47 itRes = costPlanar_.equal_range(
48 boost::icl::interval<frCoord>::closed(x1, x2));
49 break;
50 case 1:
51 itRes = costVia1_.equal_range(
52 boost::icl::interval<frCoord>::closed(x1, x2));
53 break;
54 case 2:
55 itRes = costVia2_.equal_range(
56 boost::icl::interval<frCoord>::closed(x1, x2));
57 break;
58 default:;
59 }
60 for (auto it = itRes.first; it != itRes.second; ++it) {
61 auto& intv = it->first;
62 auto& objS = it->second;
63 frUInt4 tmpCost = 0;
64 frUInt4 len = max(intv.upper() - intv.lower(), 1);
65 for (auto& obj : objS) {
66 if (obj == nullptr) {
67 tmpCost++;
68 // only add cost for diff-net
69 } else if (obj->typeId() == frcNet) {
70 if (fig->getPin()->getGuide()->getNet() != obj) {
71 tmpCost++;
72 }
73 // two taObjs
74 } else if (obj->typeId() == tacPathSeg || obj->typeId() == tacVia) {
75 auto taObj = static_cast<taPinFig*>(obj);
76 if (fig->getPin()->getGuide()->getNet()
77 != taObj->getPin()->getGuide()->getNet()) {
78 tmpCost++;
79 }
80 } else {
81 cout << "Warning: taTrack::getCost unsupported type" << endl;
82 }
83 }
84 cost += tmpCost * len;
85 }
86 return cost;
87 }
88