diff --git a/src/drt/src/dr/FlexDR.h b/src/drt/src/dr/FlexDR.h index 88ff37495b9..a5be2d219b5 100644 --- a/src/drt/src/dr/FlexDR.h +++ b/src/drt/src/dr/FlexDR.h @@ -446,6 +446,7 @@ class FlexDRWorker frBlockObject* block; int numReroute; bool doRoute; + frBlockObject* checkingObj; }; frDesign* design_ = nullptr; Logger* logger_ = nullptr; @@ -737,7 +738,8 @@ class FlexDRWorker std::set& uniqueVictims, std::set& uniqueAggressors, std::vector& checks, - std::vector& routes); + std::vector& routes, + frBlockObject* checkingObj); void getRipUpNetsFromMarker(frMarker* marker, std::set& nets, frCoord bloatDist = 0); @@ -746,7 +748,8 @@ class FlexDRWorker std::queue& rerouteQueue); void route_queue_update_queue( const std::vector>& markers, - std::queue& rerouteQueue); + std::queue& rerouteQueue, + frBlockObject* checkingObj = nullptr); bool canRipup(drNet* n); // route void addPathCost(drConnFig* connFig, diff --git a/src/drt/src/dr/FlexDR_init.cpp b/src/drt/src/dr/FlexDR_init.cpp index e3862e2a84b..4da00ce4537 100644 --- a/src/drt/src/dr/FlexDR_init.cpp +++ b/src/drt/src/dr/FlexDR_init.cpp @@ -2746,7 +2746,7 @@ void FlexDRWorker::route_queue_init_queue( if (getRipupMode() == RipUpMode::DRC) { for (auto& marker : markers_) { route_queue_update_from_marker( - &marker, uniqueVictims, uniqueAggressors, checks, routes); + &marker, uniqueVictims, uniqueAggressors, checks, routes, nullptr); } mazeIterInit_sortRerouteQueue(0, checks); mazeIterInit_sortRerouteQueue(0, routes); @@ -2761,7 +2761,7 @@ void FlexDRWorker::route_queue_init_queue( // sort nets mazeIterInit_sortRerouteNets(0, ripupNets); for (auto& net : ripupNets) { - routes.push_back({net, 0, true}); + routes.push_back({net, 0, true, nullptr}); // reserve via because all nets are ripped up initMazeCost_via_helper(net, true); // no need to clear the net because route objs are not pushed to the net @@ -2790,7 +2790,7 @@ void FlexDRWorker::route_queue_init_queue( // sort nets mazeIterInit_sortRerouteNets(0, ripupNets); for (auto& net : ripupNets) { - routes.push_back({net, 0, true}); + routes.push_back({net, 0, true, nullptr}); initMazeCost_via_helper(net, true); } } else if (getRipupMode() == RipUpMode::INCR) { @@ -2804,7 +2804,7 @@ void FlexDRWorker::route_queue_init_queue( // sort nets mazeIterInit_sortRerouteNets(0, ripupNets); for (auto& net : ripupNets) { - routes.push_back({net, 0, true}); + routes.push_back({net, 0, true, nullptr}); // reserve via because all nets are ripped up initMazeCost_via_helper(net, true); // no need to clear the net because route objs are not pushed to the net @@ -2840,7 +2840,8 @@ void FlexDRWorker::route_queue_update_from_marker( std::set& uniqueVictims, std::set& uniqueAggressors, std::vector& checks, - std::vector& routes) + std::vector& routes, + frBlockObject* checkingObj) { // if shapes don't overlap routeBox, ignore violation if (!getRouteBox().intersects(marker->getBBox())) { @@ -3002,7 +3003,7 @@ void FlexDRWorker::route_queue_update_from_marker( allowAvoidRipup = true; dNet->setNRipupAvoids(0); } - routes.push_back({dNet, dNet->getNumReroutes(), true}); + routes.push_back({dNet, dNet->getNumReroutes(), true, checkingObj}); } } } @@ -3011,14 +3012,14 @@ void FlexDRWorker::route_queue_update_from_marker( for (drNet* dNet : avoidRipupCandidates) { if (allowAvoidRipup) { dNet->incNRipupAvoids(); - checks.push_back({dNet, -1, false}); + checks.push_back({dNet, -1, false, checkingObj}); } else { dNet->setNRipupAvoids(0); - routes.push_back({dNet, dNet->getNumReroutes(), true}); + routes.push_back({dNet, dNet->getNumReroutes(), true, checkingObj}); } } for (auto& victimOwner : uniqueVictimOwners) { - checks.push_back({victimOwner, -1, false}); + checks.push_back({victimOwner, -1, false, checkingObj}); } } @@ -3068,17 +3069,21 @@ bool FlexDRWorker::canRipup(drNet* n) void FlexDRWorker::route_queue_update_queue( const std::vector>& markers, - std::queue& rerouteQueue) + std::queue& rerouteQueue, + frBlockObject* checkingObj) { std::set uniqueVictims; std::set uniqueAggressors; std::vector checks; std::vector routes; - + if (checkingObj != nullptr + && checkingObj->typeId() == frBlockObjectEnum::drcNet) { + checkingObj = static_cast(checkingObj)->getFrNet(); + } for (auto& uMarker : markers) { auto marker = uMarker.get(); route_queue_update_from_marker( - marker, uniqueVictims, uniqueAggressors, checks, routes); + marker, uniqueVictims, uniqueAggressors, checks, routes, checkingObj); } route_queue_update_queue(checks, routes, rerouteQueue); @@ -3460,6 +3465,23 @@ void FlexDRWorker::initMazeCost_planarTerm(const frDesign* design) // term no bloat switch (obj->typeId()) { case frcBTerm: { + auto bterm = static_cast(obj); + bool hasHorizontalAccess = false; + bool hasVerticalAccess = false; + for (const auto& pin : bterm->getPins()) { + for (int i = 0; i < pin->getNumPinAccess(); i++) { + const auto& pa = pin->getPinAccess(i); + for (const auto& ap : pa->getAccessPoints()) { + if (ap->getLayerNum() != layerNum) { + continue; + } + hasVerticalAccess |= ap->hasAccess(frDirEnum::N); + hasVerticalAccess |= ap->hasAccess(frDirEnum::S); + hasHorizontalAccess |= ap->hasAccess(frDirEnum::W); + hasHorizontalAccess |= ap->hasAccess(frDirEnum::E); + } + } + } FlexMazeIdx mIdx1, mIdx2; gridGraph_.getIdxBox(mIdx1, mIdx2, box); const bool isLayerHorz = layer->isHorizontal(); @@ -3468,10 +3490,10 @@ void FlexDRWorker::initMazeCost_planarTerm(const frDesign* design) FlexMazeIdx mIdx(i, j, zIdx); gridGraph_.setBlocked(i, j, zIdx, frDirEnum::U); gridGraph_.setBlocked(i, j, zIdx, frDirEnum::D); - if (isLayerHorz) { + if (isLayerHorz && hasHorizontalAccess) { gridGraph_.setBlocked(i, j, zIdx, frDirEnum::N); gridGraph_.setBlocked(i, j, zIdx, frDirEnum::S); - } else { + } else if (!isLayerHorz && hasVerticalAccess) { gridGraph_.setBlocked(i, j, zIdx, frDirEnum::W); gridGraph_.setBlocked(i, j, zIdx, frDirEnum::E); } @@ -3490,10 +3512,10 @@ void FlexDRWorker::initMazeCost_connFig() { for (auto& net : nets_) { for (auto& connFig : net->getExtConnFigs()) { - addPathCost(connFig.get()); + addPathCost(connFig.get(), false, true); } for (auto& connFig : net->getRouteConnFigs()) { - addPathCost(connFig.get()); + addPathCost(connFig.get(), false, true); } gcWorker_->updateDRNet(net.get()); gcWorker_->updateGCWorker(); @@ -3548,9 +3570,9 @@ void FlexDRWorker::initMazeCost_via_helper(drNet* net, bool isAddPathCost) via->addToNet(net); initMazeIdx_connFig(via.get()); if (isAddPathCost) { - addPathCost(via.get(), true); + addPathCost(via.get(), true, true); } else { - subPathCost(via.get(), true); + subPathCost(via.get(), true, true); } } } diff --git a/src/drt/src/dr/FlexDR_maze.cpp b/src/drt/src/dr/FlexDR_maze.cpp index 69610fc25ab..54cb81368ca 100644 --- a/src/drt/src/dr/FlexDR_maze.cpp +++ b/src/drt/src/dr/FlexDR_maze.cpp @@ -1466,7 +1466,7 @@ void FlexDRWorker::modPathCost(drConnFig* connFig, box = rect->getBBox(); xform.apply(box); if (modCutSpc) { - modCutSpacingCost(box, bi.z(), type); + modCutSpacingCost(box, bi.z(), type, false, bi.x(), bi.y()); } modInterLayerCutSpacingCost(box, bi.z(), type, true); modInterLayerCutSpacingCost(box, bi.z(), type, false); @@ -1755,7 +1755,7 @@ void FlexDRWorker::identifyCongestionLevel() void FlexDRWorker::route_queue_main(std::queue& rerouteQueue) { int gc_version = 1; - std::map obj_gc_version; + std::map> obj_gc_version; auto& workerRegionQuery = getWorkerRegionQuery(); while (!rerouteQueue.empty()) { auto& entry = rerouteQueue.front(); @@ -1772,6 +1772,14 @@ void FlexDRWorker::route_queue_main(std::queue& rerouteQueue) if (numReroute != net->getNumReroutes()) { continue; } + if (ripupMode_ == RipUpMode::DRC && entry.checkingObj != nullptr + && obj_gc_version.find(net->getFrNet()) != obj_gc_version.end() + && obj_gc_version.find(entry.checkingObj) != obj_gc_version.end() + && obj_gc_version[net->getFrNet()] == std::make_pair(gc_version, 0) + && obj_gc_version[entry.checkingObj] + == std::make_pair(gc_version, 0)) { + continue; + } // init net->setModified(true); if (net->getFrNet()) { @@ -1782,7 +1790,7 @@ void FlexDRWorker::route_queue_main(std::queue& rerouteQueue) graphics_->startNet(net); } for (auto& uConnFig : net->getRouteConnFigs()) { - subPathCost(uConnFig.get()); + subPathCost(uConnFig.get(), false, true); workerRegionQuery.remove(uConnFig.get()); // worker region query } modEolCosts_poly(gcWorker_->getNet(net->getFrNet()), @@ -1890,7 +1898,8 @@ void FlexDRWorker::route_queue_main(std::queue& rerouteQueue) } } didCheck = true; - obj_gc_version[net->getFrNet()] = gc_version; + obj_gc_version[net->getFrNet()] + = {gc_version, gcWorker_->getMarkers().size()}; } else { logger_->error(DRT, 1006, "failed to setTargetNet"); @@ -1898,10 +1907,9 @@ void FlexDRWorker::route_queue_main(std::queue& rerouteQueue) } else { gcWorker_->setEnableSurgicalFix(false); if (obj_gc_version.find(obj) != obj_gc_version.end() - && obj_gc_version[obj] == gc_version) { + && obj_gc_version[obj].first == gc_version) { continue; } - obj_gc_version[obj] = gc_version; if (obj->typeId() == frcNet) { auto net = static_cast(obj); if (gcWorker_->setTargetNet(net)) { @@ -1914,10 +1922,11 @@ void FlexDRWorker::route_queue_main(std::queue& rerouteQueue) didCheck = true; } } + obj_gc_version[obj] = {gc_version, gcWorker_->getMarkers().size()}; } // end if (didCheck) { - route_queue_update_queue(gcWorker_->getMarkers(), rerouteQueue); + route_queue_update_queue(gcWorker_->getMarkers(), rerouteQueue, obj); } if (didRoute) { route_queue_markerCostDecay(); diff --git a/src/drt/src/dr/FlexGridGraph_maze.cpp b/src/drt/src/dr/FlexGridGraph_maze.cpp index d108725bbe9..4650c2e1eea 100644 --- a/src/drt/src/dr/FlexGridGraph_maze.cpp +++ b/src/drt/src/dr/FlexGridGraph_maze.cpp @@ -216,31 +216,31 @@ frCost FlexGridGraph::getEstCost(const FlexMazeIdx& src, // avoid propagating to location that will cause forbidden via spacing to // boundary pin bool isForbidden = false; - if (dstMazeIdx1 == dstMazeIdx2 && gridZ == dstMazeIdx1.z()) { + if (dstMazeIdx1.z() == dstMazeIdx2.z() && gridZ == dstMazeIdx1.z()) { auto layerNum = (gridZ + 1) * 2; auto layer = getTech()->getLayer(layerNum); - if (layer->isUnidirectional()) { + if (!USENONPREFTRACKS || layer->isUnidirectional()) { bool isH = (layer->getDir() == dbTechLayerDir::HORIZONTAL); - if (isH) { + if (isH && dstMazeIdx1.y() == dstMazeIdx2.y()) { auto gap = abs(nextPoint.y() - dstPoint1.y()); if (gap - && (getTech()->isVia2ViaForbiddenLen( - gridZ, false, false, false, gap, ndr_) - || layerNum - 2 < BOTTOM_ROUTING_LAYER) - && (getTech()->isVia2ViaForbiddenLen( - gridZ, true, true, false, gap, ndr_) - || layerNum + 2 > getTech()->getTopLayerNum())) { + && (layerNum - 2 < BOTTOM_ROUTING_LAYER + || getTech()->isVia2ViaForbiddenLen( + gridZ - 1, false, false, false, gap, ndr_)) + && (layerNum + 2 > getTech()->getTopLayerNum() + || getTech()->isVia2ViaForbiddenLen( + gridZ + 1, true, true, false, gap, ndr_))) { isForbidden = true; } - } else { + } else if (!isH && dstMazeIdx1.x() == dstMazeIdx2.x()) { auto gap = abs(nextPoint.x() - dstPoint1.x()); if (gap - && (getTech()->isVia2ViaForbiddenLen( - gridZ, false, false, true, gap, ndr_) - || layerNum - 2 < BOTTOM_ROUTING_LAYER) - && (getTech()->isVia2ViaForbiddenLen( - gridZ, true, true, true, gap, ndr_) - || layerNum + 2 > getTech()->getTopLayerNum())) { + && (layerNum - 2 < BOTTOM_ROUTING_LAYER + || getTech()->isVia2ViaForbiddenLen( + gridZ - 1, false, false, true, gap, ndr_)) + && (layerNum + 2 > getTech()->getTopLayerNum() + || getTech()->isVia2ViaForbiddenLen( + gridZ + 1, true, true, true, gap, ndr_))) { isForbidden = true; } } diff --git a/src/drt/test/ndr_vias1.defok b/src/drt/test/ndr_vias1.defok index c0e9fd7e499..bd356e7f80a 100644 --- a/src/drt/test/ndr_vias1.defok +++ b/src/drt/test/ndr_vias1.defok @@ -231,9 +231,9 @@ NETS 8 ; NEW met1 ( 132710 172890 210 ) ( 152030 * 210 ) NEW met1 ( 152030 169830 210 ) ( 167900 * 210 ) NEW met1 TAPER ( 116610 118490 ) ( 118220 * ) - NEW met1 TAPER ( 152950 151130 ) ( 154330 * ) - NEW met2 ( 154330 118490 210 ) ( * 151130 210 ) - NEW met2 ( 152950 151130 210 ) ( * 169830 210 ) + NEW met1 TAPER ( 152490 150450 ) ( 154330 * ) + NEW met2 ( 154330 118490 210 ) ( * 150450 210 ) + NEW met2 ( 152950 150450 210 ) ( * 169830 210 ) NEW met1 ( 118220 118490 210 ) ( 167900 * 210 ) NEW li1 TAPER ( 169510 118490 ) L1M1_PR_R NEW li1 TAPER ( 169510 169830 ) L1M1_PR_R @@ -242,13 +242,13 @@ NETS 8 ; NEW li1 TAPER ( 130870 172890 ) L1M1_PR_R NEW met1 ( 152950 169830 ) M1M2_PR_R NEW li1 TAPER ( 116610 118490 ) L1M1_PR_R - NEW li1 TAPER ( 152950 151130 ) L1M1_PR_R - NEW met1 TAPER ( 154330 151130 ) M1M2_PR_R + NEW li1 TAPER ( 152490 150450 ) L1M1_PR_R + NEW met1 TAPER ( 154330 150450 ) M1M2_PR_R NEW met1 ( 154330 118490 ) M1M2_PR_R - NEW met1 TAPER ( 152950 151130 ) M1M2_PR_R + NEW met1 TAPER ( 152950 150450 ) M1M2_PR_R NEW met1 TAPER ( 152950 169830 ) RECT ( -490 -70 0 70 ) NEW met1 TAPER ( 154330 118490 ) RECT ( -490 -70 0 70 ) - NEW met1 TAPER ( 152950 151130 ) RECT ( -490 -70 0 70 ) ; + NEW met1 TAPER ( 152950 150450 ) RECT ( -490 -70 0 70 ) ; - clknet_2_0__leaf_clk ( _414_ CLK ) ( _418_ CLK ) ( _428_ CLK ) ( _429_ CLK ) ( _432_ CLK ) ( _434_ CLK ) ( _444_ CLK ) ( _445_ CLK ) ( clkbuf_2_0__f_clk X ) + USE CLOCK + NONDEFAULTRULE NDR_3W_3S + ROUTED met1 ( 87630 120870 210 ) ( 91540 * 210 ) @@ -320,9 +320,9 @@ NETS 8 ; NEW met2 ( 158010 88570 210 ) ( * 101830 210 ) NEW met1 ( 158010 88570 210 ) ( 162610 * 210 ) NEW met1 TAPER ( 162610 88570 ) ( 164450 * ) - NEW met1 TAPER ( 171350 118490 ) ( 172730 * ) - NEW met2 ( 172730 90950 210 ) ( * 118490 210 ) - NEW met2 ( 172730 118490 210 ) ( * 120530 210 ) + NEW met1 TAPER ( 170890 117810 ) ( 172730 * ) + NEW met2 ( 172730 90950 210 ) ( * 117810 210 ) + NEW met2 ( 172730 117810 210 ) ( * 120530 210 ) NEW met1 TAPER ( 168130 120530 ) ( 172730 * ) NEW met1 ( 172730 120530 210 ) ( 200330 * 210 ) NEW met1 ( 152950 129370 210 ) ( 154330 * 210 ) @@ -347,8 +347,8 @@ NETS 8 ; NEW li1 TAPER ( 158010 101830 ) L1M1_PR_R NEW met1 TAPER ( 158010 101830 ) M1M2_PR_R NEW met1 ( 158010 88570 ) M1M2_PR_R - NEW li1 TAPER ( 171350 118490 ) L1M1_PR_R - NEW met1 TAPER ( 172730 118490 ) M1M2_PR_R + NEW li1 TAPER ( 170890 117810 ) L1M1_PR_R + NEW met1 TAPER ( 172730 117810 ) M1M2_PR_R NEW met1 ( 172730 90950 ) M1M2_PR_R NEW met1 TAPER ( 172730 120530 ) M1M2_PR_R NEW li1 TAPER ( 156170 129370 ) L1M1_PR_R @@ -375,13 +375,6 @@ NETS 8 ; NEW met2 ( 96830 183770 210 ) ( * 186150 210 ) NEW met1 ( 96830 183770 210 ) ( 98210 * 210 ) NEW met2 ( 98210 151130 210 ) ( * 183770 210 ) - NEW met2 ( 137770 210460 210 ) ( * 210630 210 ) - NEW met3 ( 137770 210460 450 ) ( 143290 * 450 ) - NEW met2 ( 143290 210460 210 ) ( * 210630 210 ) - NEW met1 ( 143290 210630 210 ) ( 148810 * 210 ) - NEW met1 TAPER ( 148810 210630 ) ( 150650 * ) - NEW met1 TAPER ( 135930 210630 ) ( 137770 * ) - NEW met1 ( 126270 210630 210 ) ( 135930 * 210 ) NEW met2 ( 140990 159290 210 ) ( * 175270 210 ) NEW met1 ( 140990 159290 210 ) ( 142140 * 210 ) NEW met1 TAPER ( 142140 159290 ) ( 143750 * ) @@ -390,16 +383,24 @@ NETS 8 ; NEW met1 TAPER ( 139380 175270 ) ( 140990 * ) NEW met2 ( 125810 175270 210 ) ( * 183430 210 ) NEW met1 ( 125810 175270 210 ) ( 131790 * 210 ) - NEW met2 ( 125810 206380 210 ) ( 126270 * 210 ) - NEW met2 ( 125810 183430 210 ) ( * 206380 210 ) - NEW met2 ( 111550 197370 210 ) ( * 199750 210 ) - NEW met1 ( 111550 197370 210 ) ( 125810 * 210 ) - NEW met1 TAPER ( 125810 199750 ) ( 126270 * ) NEW met1 ( 109250 186150 210 ) ( 125810 * 210 ) - NEW met2 ( 126270 206380 210 ) ( * 210630 210 ) + NEW met1 ( 146970 210970 210 ) ( 148810 * 210 ) + NEW met1 TAPER ( 148810 210970 ) ( 150650 * ) + NEW met1 ( 146970 210970 210 ) ( * 213350 210 ) + NEW met1 ( 144900 213350 210 ) ( 146970 * 210 ) + NEW met2 ( 125810 183430 210 ) ( * 193200 210 ) + NEW met2 ( 126270 200090 210 ) ( * 214030 210 ) + NEW met1 ( 126270 214030 210 ) ( 138230 * 210 ) + NEW met1 ( 138230 213690 210 ) ( * 214030 210 ) + NEW met1 ( 138230 213690 210 ) ( 144900 * 210 ) + NEW met1 ( 144900 213350 210 ) ( * 213690 210 ) + NEW met2 ( 137770 210970 210 ) ( * 214030 210 ) + NEW met2 ( 125810 193200 210 ) ( 126270 * 210 ) + NEW met2 ( 126270 193200 210 ) ( * 200090 210 ) + NEW met2 ( 111550 200090 210 ) ( * 200260 210 ) + NEW met3 ( 111550 200260 450 ) ( 126270 * 450 ) NEW met1 ( 98210 151130 ) M1M2_PR_R NEW li1 TAPER ( 100050 151130 ) L1M1_PR_R - NEW met1 ( 126270 210630 ) M1M2_PR_R NEW li1 TAPER ( 109250 183770 ) L1M1_PR_R NEW met1 TAPER ( 109250 183770 ) M1M2_PR_R NEW met1 ( 109250 186150 ) M1M2_PR_R @@ -407,12 +408,6 @@ NETS 8 ; NEW li1 TAPER ( 96830 186150 ) L1M1_PR_R NEW met1 TAPER ( 96830 186150 ) M1M2_PR_R NEW met1 ( 96830 183770 ) M1M2_PR_R - NEW li1 TAPER ( 137770 210630 ) L1M1_PR_R - NEW met1 TAPER ( 137770 210630 ) M1M2_PR_R - NEW met2 ( 137770 210460 ) M2M3_PR - NEW met2 ( 143290 210460 ) M2M3_PR - NEW met1 ( 143290 210630 ) M1M2_PR_R - NEW li1 TAPER ( 150650 210630 ) L1M1_PR_R NEW li1 TAPER ( 140990 175270 ) L1M1_PR_R NEW met1 TAPER ( 140990 175270 ) M1M2_PR_R NEW met1 ( 140990 159290 ) M1M2_PR_R @@ -423,23 +418,28 @@ NETS 8 ; NEW li1 TAPER ( 125810 183430 ) L1M1_PR_R NEW met1 TAPER ( 125810 183430 ) M1M2_PR_R NEW met1 ( 125810 175270 ) M1M2_PR_R - NEW li1 TAPER ( 111550 199750 ) L1M1_PR_R - NEW met1 TAPER ( 111550 199750 ) M1M2_PR_R - NEW met1 ( 111550 197370 ) M1M2_PR_R - NEW met1 ( 125810 197370 ) M1M2_PR_R - NEW li1 TAPER ( 126270 199750 ) L1M1_PR_R - NEW met1 TAPER ( 125810 199750 ) M1M2_PR_R NEW met1 ( 125810 186150 ) M1M2_PR_R + NEW li1 TAPER ( 150650 210970 ) L1M1_PR_R + NEW li1 TAPER ( 126270 200090 ) L1M1_PR_R + NEW met1 TAPER ( 126270 200090 ) M1M2_PR_R + NEW met1 ( 126270 214030 ) M1M2_PR_R + NEW li1 TAPER ( 137770 210970 ) L1M1_PR_R + NEW met1 TAPER ( 137770 210970 ) M1M2_PR_R + NEW met1 ( 137770 214030 ) M1M2_PR_R + NEW li1 TAPER ( 111550 200090 ) L1M1_PR_R + NEW met1 TAPER ( 111550 200090 ) M1M2_PR_R + NEW met2 ( 111550 200260 ) M2M3_PR + NEW met2 ( 126270 200260 ) M2M3_PR NEW met1 TAPER ( 109250 183770 ) RECT ( -355 -70 0 70 ) NEW met1 TAPER ( 96830 186150 ) RECT ( -355 -70 0 70 ) - NEW met1 TAPER ( 137770 210630 ) RECT ( -355 -70 0 70 ) NEW met1 TAPER ( 140990 175270 ) RECT ( -355 -70 0 70 ) NEW met1 TAPER ( 131790 172210 ) RECT ( -355 -70 0 70 ) NEW met1 TAPER ( 125810 183430 ) RECT ( -355 -70 0 70 ) - NEW met1 TAPER ( 111550 199750 ) RECT ( -355 -70 0 70 ) - NEW met2 TAPER ( 125810 197370 ) RECT ( -70 -305 70 0 ) - NEW met2 TAPER ( 125810 199750 ) RECT ( -70 -305 70 0 ) - NEW met2 TAPER ( 125810 186150 ) RECT ( -70 -305 70 0 ) ; + NEW met2 TAPER ( 125810 186150 ) RECT ( -70 -305 70 0 ) + NEW met1 TAPER ( 126270 200090 ) RECT ( -355 -70 0 70 ) + NEW met1 TAPER ( 137770 210970 ) RECT ( -355 -70 0 70 ) + NEW met1 TAPER ( 137770 214030 ) RECT ( -490 -70 0 70 ) + NEW met1 TAPER ( 111550 200090 ) RECT ( -355 -70 0 70 ) ; - clknet_2_3__leaf_clk ( _412_ CLK ) ( _419_ CLK ) ( _420_ CLK ) ( _422_ CLK ) ( _435_ CLK ) ( _436_ CLK ) ( _438_ CLK ) ( _439_ CLK ) ( clkbuf_2_3__f_clk X ) + USE CLOCK + NONDEFAULTRULE NDR_3W_3S + ROUTED met1 TAPER ( 204010 194310 ) ( 205850 * ) @@ -506,28 +506,30 @@ NETS 8 ; NEW li1 ( 170890 209950 ) L1M1_PR_MR NEW met1 ( 170890 209950 ) M1M2_PR ; - ctrl.state.out\[2\] ( _413_ Q ) ( _297_ A ) ( _293_ A ) ( _290_ A1 ) ( _284_ A ) ( _279_ A ) + USE SIGNAL - + ROUTED met2 ( 158470 207570 ) ( * 209950 ) - NEW met1 ( 158010 213350 ) ( 158470 * ) - NEW met2 ( 158470 209950 ) ( * 213350 ) - NEW met1 ( 158470 207570 ) ( 166290 * ) - NEW met1 ( 158010 200090 ) ( * 200430 ) + + ROUTED met1 ( 158010 200090 ) ( * 200430 ) NEW met1 ( 158010 200430 ) ( 158470 * ) NEW met2 ( 158470 194650 ) ( * 200430 ) NEW met1 ( 158010 191590 ) ( 158470 * ) NEW met2 ( 158470 191590 ) ( * 194650 ) - NEW met2 ( 158470 200430 ) ( * 207570 ) NEW met1 ( 158470 194650 ) ( 167210 * ) + NEW met2 ( 158470 200430 ) ( * 207000 ) + NEW met1 ( 158010 211650 ) ( 158470 * ) + NEW met2 ( 158010 211650 ) ( * 213350 ) + NEW met2 ( 158010 207570 ) ( * 211650 ) + NEW met2 ( 158010 207000 ) ( 158470 * ) + NEW met2 ( 158010 207000 ) ( * 207570 ) + NEW met1 ( 158010 207570 ) ( 166290 * ) NEW li1 ( 167210 194650 ) L1M1_PR_MR - NEW met1 ( 158470 207570 ) M1M2_PR - NEW li1 ( 158470 209950 ) L1M1_PR_MR - NEW met1 ( 158470 209950 ) M1M2_PR - NEW li1 ( 158010 213350 ) L1M1_PR_MR - NEW met1 ( 158470 213350 ) M1M2_PR NEW li1 ( 166290 207570 ) L1M1_PR_MR NEW li1 ( 158010 200090 ) L1M1_PR_MR NEW met1 ( 158470 200430 ) M1M2_PR NEW met1 ( 158470 194650 ) M1M2_PR NEW li1 ( 158010 191590 ) L1M1_PR_MR - NEW met1 ( 158470 191590 ) M1M2_PR ; + NEW met1 ( 158470 191590 ) M1M2_PR + NEW li1 ( 158470 211650 ) L1M1_PR_MR + NEW met1 ( 158010 211650 ) M1M2_PR + NEW li1 ( 158010 213350 ) L1M1_PR_MR + NEW met1 ( 158010 213350 ) M1M2_PR + NEW met1 ( 158010 207570 ) M1M2_PR ; END NETS END DESIGN diff --git a/src/drt/test/ndr_vias2.defok b/src/drt/test/ndr_vias2.defok index d0c7e13125e..43eb640182e 100644 --- a/src/drt/test/ndr_vias2.defok +++ b/src/drt/test/ndr_vias2.defok @@ -297,13 +297,13 @@ NETS 8 ; NEW met1 TAPER ( 117990 118150 ) ( 120060 * ) NEW met1 ( 120060 118150 210 ) ( 125350 * 210 ) NEW met2 ( 111090 120870 210 ) ( * 134470 210 ) - NEW met2 ( 131790 117300 210 ) ( * 118150 210 ) - NEW met3 ( 131790 117300 450 ) ( 144900 * 450 ) + NEW met2 ( 131330 117300 210 ) ( * 118150 210 ) + NEW met3 ( 131330 117300 450 ) ( 144900 * 450 ) NEW met4 ( 144900 89420 450 ) ( * 117300 450 ) NEW met3 ( 144900 89420 450 ) ( 146510 * 450 ) NEW met2 ( 146510 88570 210 ) ( * 89420 210 ) - NEW met2 ( 143750 115430 210 ) ( * 117300 210 ) - NEW met1 ( 125350 118150 210 ) ( 131790 * 210 ) + NEW met2 ( 143750 115770 210 ) ( * 117300 210 ) + NEW met1 ( 125350 118150 210 ) ( 131330 * 210 ) NEW met4 ( 137540 117300 450 ) ( * 131100 450 ) NEW met4 ( 136620 131100 450 ) ( 137540 * 450 ) NEW met4 ( 136620 131100 450 ) ( * 145180 450 ) @@ -325,15 +325,15 @@ NETS 8 ; NEW met1 ( 125350 118150 ) M1M2_PR_R NEW li1 TAPER ( 111090 134470 ) L1M1_PR_R NEW met1 TAPER ( 111090 134470 ) M1M2_PR_R - NEW met1 ( 131790 118150 ) M1M2_PR_R - NEW met2 ( 131790 117300 ) M2M3_PR_R + NEW met1 ( 131330 118150 ) M1M2_PR_R + NEW met2 ( 131330 117300 ) M2M3_PR_R NEW met3 ( 144900 117300 ) M3M4_PR_R NEW met3 ( 144900 89420 ) M3M4_PR_R NEW met2 ( 146510 89420 ) M2M3_PR_R NEW li1 TAPER ( 146510 88570 ) L1M1_PR_R NEW met1 TAPER ( 146510 88570 ) M1M2_PR_R - NEW li1 TAPER ( 143750 115430 ) L1M1_PR_R - NEW met1 TAPER ( 143750 115430 ) M1M2_PR_R + NEW li1 TAPER ( 143750 115770 ) L1M1_PR_R + NEW met1 TAPER ( 143750 115770 ) M1M2_PR_R NEW met2 ( 143750 117300 ) M2M3_PR_R NEW met3 ( 137540 117300 ) M3M4_PR_R NEW met3 ( 136620 145180 ) M3M4_PR_R @@ -346,7 +346,7 @@ NETS 8 ; NEW met1 TAPER ( 125350 120870 ) RECT ( -355 -70 0 70 ) NEW met1 TAPER ( 111090 134470 ) RECT ( -355 -70 0 70 ) NEW met1 TAPER ( 146510 88570 ) RECT ( -355 -70 0 70 ) - NEW met1 TAPER ( 143750 115430 ) RECT ( -355 -70 0 70 ) + NEW met1 TAPER ( 143750 115770 ) RECT ( -355 -70 0 70 ) NEW met3 TAPER ( 143750 117300 ) RECT ( -705 -150 0 150 ) NEW met3 TAPER ( 137540 117300 ) RECT ( -630 -150 0 150 ) NEW met3 TAPER ( 136620 145180 ) RECT ( -435 -150 0 150 ) @@ -356,15 +356,15 @@ NETS 8 ; + ROUTED met2 ( 156170 124270 210 ) ( * 129030 210 ) NEW met3 ( 155940 129540 450 ) ( 156170 * 450 ) NEW met2 ( 156170 129030 210 ) ( * 129540 210 ) - NEW met2 ( 158010 101660 210 ) ( * 101830 210 ) - NEW met3 ( 155940 101660 450 ) ( 158010 * 450 ) - NEW met4 ( 155940 101660 450 ) ( * 129540 450 ) + NEW met2 ( 158010 102170 210 ) ( * 102340 210 ) + NEW met3 ( 155940 102340 450 ) ( 158010 * 450 ) + NEW met4 ( 155940 102340 450 ) ( * 129540 450 ) NEW met1 ( 158010 88570 210 ) ( 162610 * 210 ) NEW met1 TAPER ( 162610 88570 ) ( 164450 * ) - NEW met2 ( 158010 88570 210 ) ( * 101660 210 ) - NEW met1 ( 164450 91290 210 ) ( 177100 * 210 ) - NEW met1 TAPER ( 177100 91290 ) ( 178710 * ) - NEW met2 ( 164450 88570 210 ) ( * 91290 210 ) + NEW met2 ( 158010 88570 210 ) ( * 102170 210 ) + NEW met1 ( 164450 90950 210 ) ( 177100 * 210 ) + NEW met1 TAPER ( 177100 90950 ) ( 178710 * ) + NEW met2 ( 164450 88570 210 ) ( * 90950 210 ) NEW met3 ( 152950 147900 450 ) ( 155940 * 450 ) NEW met2 ( 152950 147900 210 ) ( * 148070 210 ) NEW met4 ( 155940 129540 450 ) ( * 147900 450 ) @@ -392,14 +392,14 @@ NETS 8 ; NEW met1 ( 156170 124270 ) M1M2_PR_R NEW met3 ( 155940 129540 ) M3M4_PR_R NEW met2 ( 156170 129540 ) M2M3_PR_R - NEW li1 TAPER ( 158010 101830 ) L1M1_PR_R - NEW met1 TAPER ( 158010 101830 ) M1M2_PR_R - NEW met2 ( 158010 101660 ) M2M3_PR_R - NEW met3 ( 155940 101660 ) M3M4_PR_R + NEW li1 TAPER ( 158010 102170 ) L1M1_PR_R + NEW met1 TAPER ( 158010 102170 ) M1M2_PR_R + NEW met2 ( 158010 102340 ) M2M3_PR_R + NEW met3 ( 155940 102340 ) M3M4_PR_R NEW li1 TAPER ( 164450 88570 ) L1M1_PR_R NEW met1 ( 158010 88570 ) M1M2_PR_R - NEW li1 TAPER ( 178710 91290 ) L1M1_PR_R - NEW met1 ( 164450 91290 ) M1M2_PR_R + NEW li1 TAPER ( 178710 90950 ) L1M1_PR_R + NEW met1 ( 164450 90950 ) M1M2_PR_R NEW met1 TAPER ( 164450 88570 ) M1M2_PR_R NEW met3 ( 155940 147900 ) M3M4_PR_R NEW met2 ( 152950 147900 ) M2M3_PR_R @@ -419,7 +419,7 @@ NETS 8 ; NEW met1 TAPER ( 205850 96390 ) RECT ( -355 -70 0 70 ) NEW met1 TAPER ( 156170 129030 ) RECT ( -355 -70 0 70 ) NEW met3 TAPER ( 155940 129540 ) RECT ( -435 -150 0 150 ) - NEW met1 TAPER ( 158010 101830 ) RECT ( -355 -70 0 70 ) + NEW met1 TAPER ( 158010 102170 ) RECT ( -355 -70 0 70 ) NEW met1 TAPER ( 164450 88570 ) RECT ( -490 -70 0 70 ) NEW met1 TAPER ( 152950 148070 ) RECT ( -355 -70 0 70 ) NEW met1 TAPER ( 205850 113050 ) RECT ( -490 -70 0 70 ) @@ -437,13 +437,17 @@ NETS 8 ; NEW met4 ( 130180 179860 450 ) ( * 199580 450 ) NEW met2 ( 125810 179690 210 ) ( * 183430 210 ) NEW met1 ( 125810 179690 210 ) ( 130410 * 210 ) - NEW met2 ( 96830 185980 210 ) ( * 186150 210 ) - NEW met3 ( 96830 185980 450 ) ( 111550 * 450 ) - NEW met2 ( 111550 185980 210 ) ( * 199580 210 ) - NEW met2 ( 109250 183770 210 ) ( * 185980 210 ) + NEW met2 ( 109250 183770 210 ) ( * 186150 210 ) + NEW met1 ( 109250 186150 210 ) ( 111550 * 210 ) + NEW met2 ( 111550 186150 210 ) ( * 199580 210 ) + NEW met2 ( 96830 183770 210 ) ( * 186150 210 ) + NEW met1 ( 96830 183770 210 ) ( 107410 * 210 ) + NEW met1 TAPER ( 107410 183770 ) ( 109250 * ) + NEW met3 ( 96830 183260 450 ) ( 97060 * 450 ) + NEW met2 ( 96830 183260 210 ) ( * 183770 210 ) NEW met3 ( 97060 151300 450 ) ( 100050 * 450 ) NEW met2 ( 100050 151130 210 ) ( * 151300 210 ) - NEW met4 ( 97060 151300 450 ) ( * 185980 450 ) + NEW met4 ( 97060 151300 450 ) ( * 183260 450 ) NEW met1 ( 130410 179690 210 ) ( 131100 * 210 ) NEW met2 ( 137770 210970 210 ) ( * 212500 210 ) NEW met2 ( 150650 210970 210 ) ( * 212500 210 ) @@ -471,14 +475,15 @@ NETS 8 ; NEW li1 TAPER ( 125810 183430 ) L1M1_PR_R NEW met1 TAPER ( 125810 183430 ) M1M2_PR_R NEW met1 ( 125810 179690 ) M1M2_PR_R - NEW li1 TAPER ( 96830 186150 ) L1M1_PR_R - NEW met1 TAPER ( 96830 186150 ) M1M2_PR_R - NEW met2 ( 96830 185980 ) M2M3_PR_R - NEW met2 ( 111550 185980 ) M2M3_PR_R NEW li1 TAPER ( 109250 183770 ) L1M1_PR_R NEW met1 TAPER ( 109250 183770 ) M1M2_PR_R - NEW met2 ( 109250 185980 ) M2M3_PR_R - NEW met3 ( 97060 185980 ) M3M4_PR_R + NEW met1 ( 109250 186150 ) M1M2_PR_R + NEW met1 ( 111550 186150 ) M1M2_PR_R + NEW li1 TAPER ( 96830 186150 ) L1M1_PR_R + NEW met1 TAPER ( 96830 186150 ) M1M2_PR_R + NEW met1 ( 96830 183770 ) M1M2_PR_R + NEW met3 ( 97060 183260 ) M3M4_PR_R + NEW met2 ( 96830 183260 ) M2M3_PR_R NEW met3 ( 97060 151300 ) M3M4_PR_R NEW met2 ( 100050 151300 ) M2M3_PR_R NEW li1 TAPER ( 100050 151130 ) L1M1_PR_R @@ -501,10 +506,9 @@ NETS 8 ; NEW met1 TAPER ( 111550 199750 ) RECT ( -355 -70 0 70 ) NEW met3 TAPER ( 130410 179860 ) RECT ( 0 -150 445 150 ) NEW met1 TAPER ( 125810 183430 ) RECT ( -355 -70 0 70 ) - NEW met1 TAPER ( 96830 186150 ) RECT ( -355 -70 0 70 ) NEW met1 TAPER ( 109250 183770 ) RECT ( -355 -70 0 70 ) - NEW met3 TAPER ( 109250 185980 ) RECT ( -705 -150 0 150 ) - NEW met3 TAPER ( 97060 185980 ) RECT ( -630 -150 0 150 ) + NEW met1 TAPER ( 96830 186150 ) RECT ( -355 -70 0 70 ) + NEW met3 TAPER ( 97060 183260 ) RECT ( 0 -150 435 150 ) NEW met1 TAPER ( 100050 151130 ) RECT ( -355 -70 0 70 ) NEW met1 TAPER ( 137770 210970 ) RECT ( -355 -70 0 70 ) NEW met1 TAPER ( 150650 210970 ) RECT ( -355 -70 0 70 ) diff --git a/src/drt/test/ta_pin_aligned.defok b/src/drt/test/ta_pin_aligned.defok index f80d9ac14e5..d4e43f88e19 100644 --- a/src/drt/test/ta_pin_aligned.defok +++ b/src/drt/test/ta_pin_aligned.defok @@ -121,6 +121,9 @@ NETS 2 ; - Metal2_in ( PIN Metal2_out ) ( PIN Metal2_in ) + USE SIGNAL + ROUTED metal2 ( 97850 19740 0 ) ( * 180180 0 ) ; - Metal3_in ( PIN Metal3_out ) ( PIN Metal3_in ) + USE SIGNAL - + ROUTED metal3 ( 19790 97860 0 ) ( 180510 * 0 ) ; + + ROUTED metal3 ( 176400 97580 ) ( * 97860 ) + NEW metal3 ( 180510 97580 ) ( * 97860 0 ) + NEW metal3 ( 176400 97580 ) ( 180510 * ) + NEW metal3 ( 19790 97860 0 ) ( 176400 * ) ; END NETS END DESIGN diff --git a/src/grt/src/fastroute/src/utility.cpp b/src/grt/src/fastroute/src/utility.cpp index 29460d4526b..66f48813cf5 100644 --- a/src/grt/src/fastroute/src/utility.cpp +++ b/src/grt/src/fastroute/src/utility.cpp @@ -1882,9 +1882,36 @@ void FastRouteCore::copyRS(void) void FastRouteCore::copyBR(void) { - int i, j, edgeID, numEdges, numNodes, min_y, min_x; + int i, j, edgeID, numEdges, numNodes, min_y, min_x, edgeCost; if (!sttrees_bk_.empty()) { + // Reduce usage with last routes before update + for (const int& netID : net_ids_) { + numEdges = sttrees_[netID].num_edges(); + edgeCost = nets_[netID]->getEdgeCost(); + + for (edgeID = 0; edgeID < numEdges; edgeID++) { + const TreeEdge& edge = sttrees_[netID].edges[edgeID]; + if (edge.len > 0) { + const std::vector& gridsX = edge.route.gridsX; + const std::vector& gridsY = edge.route.gridsY; + for (i = 0; i < edge.route.routelen; i++) { + if (gridsX[i] == gridsX[i + 1] && gridsY[i] == gridsY[i + 1]) { + continue; + } + if (gridsX[i] == gridsX[i + 1]) { + min_y = std::min(gridsY[i], gridsY[i + 1]); + v_edges_[min_y][gridsX[i]].usage -= edgeCost; + } else { + min_x = std::min(gridsX[i], gridsX[i + 1]); + h_edges_[gridsY[i]][min_x].usage -= edgeCost; + } + } + } + } + } + + // Clean routes for (const int& netID : net_ids_) { numEdges = sttrees_[netID].num_edges(); for (edgeID = 0; edgeID < numEdges; edgeID++) { @@ -1895,6 +1922,7 @@ void FastRouteCore::copyBR(void) } } + // Copy saved routes for (const int& netID : net_ids_) { numNodes = sttrees_bk_[netID].num_nodes(); numEdges = sttrees_bk_[netID].num_edges(); @@ -1944,38 +1972,25 @@ void FastRouteCore::copyBR(void) } } - for (i = 0; i < y_grid_; i++) { - for (j = 0; j < x_grid_ - 1; j++) { - h_edges_[i][j].usage = 0; - } - } - for (i = 0; i < y_grid_ - 1; i++) { - for (j = 0; j < x_grid_; j++) { - v_edges_[i][j].usage = 0; - } - } - - for (int netID = 0; netID < netCount(); netID++) { + // Increase usage with new routes + for (const int& netID : net_ids_) { numEdges = sttrees_[netID].num_edges(); - int edgeCost = nets_[netID]->getEdgeCost(); + edgeCost = nets_[netID]->getEdgeCost(); for (edgeID = 0; edgeID < numEdges; edgeID++) { - if (sttrees_[netID].edges[edgeID].len > 0) { - const std::vector& gridsX - = sttrees_[netID].edges[edgeID].route.gridsX; - const std::vector& gridsY - = sttrees_[netID].edges[edgeID].route.gridsY; - for (i = 0; i < sttrees_[netID].edges[edgeID].route.routelen; i++) { + const TreeEdge& edge = sttrees_[netID].edges[edgeID]; + if (edge.len > 0) { + const std::vector& gridsX = edge.route.gridsX; + const std::vector& gridsY = edge.route.gridsY; + for (i = 0; i < edge.route.routelen; i++) { if (gridsX[i] == gridsX[i + 1] && gridsY[i] == gridsY[i + 1]) { continue; } - if (gridsX[i] == gridsX[i + 1]) // a vertical edge - { + if (gridsX[i] == gridsX[i + 1]) { min_y = std::min(gridsY[i], gridsY[i + 1]); v_edges_[min_y][gridsX[i]].usage += edgeCost; v_used_ggrid_.insert(std::make_pair(min_y, gridsX[i])); - } else /// if(gridsY[i]==gridsY[i+1])// a horizontal edge - { + } else { min_x = std::min(gridsX[i], gridsX[i + 1]); h_edges_[gridsY[i]][min_x].usage += edgeCost; h_used_ggrid_.insert(std::make_pair(gridsY[i], min_x)); diff --git a/src/gui/src/dbDescriptors.cpp b/src/gui/src/dbDescriptors.cpp index 70a818a4ac3..a79671d0b7a 100644 --- a/src/gui/src/dbDescriptors.cpp +++ b/src/gui/src/dbDescriptors.cpp @@ -797,9 +797,9 @@ Descriptor::Properties DbMasterDescriptor::getProperties(std::any object) const if (site != nullptr) { props.push_back({"Site", gui->makeSelected(site)}); } - std::vector mterms; + SelectionSet mterms; for (auto mterm : master->getMTerms()) { - mterms.emplace_back(mterm->getConstName()); + mterms.insert(gui->makeSelected(mterm)); } props.push_back({"MTerms", mterms}); @@ -1688,10 +1688,9 @@ Descriptor::Properties DbITermDescriptor::getProperties(std::any object) const } } Properties props{{"Instance", gui->makeSelected(iterm->getInst())}, - {"IO type", iterm->getIoType().getString()}, {"Net", std::move(net_value)}, {"Special", iterm->isSpecial()}, - {"MTerm", iterm->getMTerm()->getConstName()}, + {"MTerm", gui->makeSelected(iterm->getMTerm())}, {"Access Points", aps}}; populateODBProperties(props, iterm); @@ -1849,6 +1848,123 @@ bool DbBTermDescriptor::getAllObjects(SelectionSet& objects) const ////////////////////////////////////////////////// +DbMTermDescriptor::DbMTermDescriptor(odb::dbDatabase* db) : db_(db) +{ +} + +std::string DbMTermDescriptor::getName(std::any object) const +{ + auto mterm = std::any_cast(object); + return mterm->getMaster()->getName() + "/" + mterm->getName(); +} + +std::string DbMTermDescriptor::getShortName(std::any object) const +{ + auto mterm = std::any_cast(object); + return mterm->getName(); +} + +std::string DbMTermDescriptor::getTypeName() const +{ + return "MTerm"; +} + +bool DbMTermDescriptor::getBBox(std::any object, odb::Rect& bbox) const +{ + auto mterm = std::any_cast(object); + bbox = mterm->getBBox(); + return true; +} + +void DbMTermDescriptor::highlight(std::any object, Painter& painter) const +{ + auto mterm = std::any_cast(object); + + auto* chip = db_->getChip(); + if (chip == nullptr) { + return; + } + auto* block = chip->getBlock(); + if (block == nullptr) { + return; + } + + std::set mterm_rects; + + for (auto mpin : mterm->getMPins()) { + for (auto box : mpin->getGeometry()) { + mterm_rects.insert(box->getBox()); + } + } + for (auto* iterm : block->getITerms()) { + if (iterm->getMTerm() == mterm) { + if (!iterm->getInst()->getPlacementStatus().isPlaced()) { + continue; + } + const odb::dbTransform inst_xfm = iterm->getInst()->getTransform(); + + for (odb::Rect rect : mterm_rects) { + inst_xfm.apply(rect); + painter.drawRect(rect); + } + } + } +} + +Descriptor::Properties DbMTermDescriptor::getProperties(std::any object) const +{ + auto gui = Gui::get(); + auto mterm = std::any_cast(object); + SelectionSet layers; + for (auto* mpin : mterm->getMPins()) { + for (auto* geom : mpin->getGeometry()) { + auto* layer = geom->getTechLayer(); + if (layer != nullptr) { + layers.insert(gui->makeSelected(layer)); + } + } + } + Properties props{{"Master", gui->makeSelected(mterm->getMaster())}, + {"IO type", mterm->getIoType().getString()}, + {"Signal type", mterm->getSigType().getString()}, + {"# Pins", mterm->getMPins().size()}, + {"Layers", layers}}; + + populateODBProperties(props, mterm); + + return props; +} + +Selected DbMTermDescriptor::makeSelected(std::any object) const +{ + if (auto mterm = std::any_cast(&object)) { + return Selected(*mterm, this); + } + return Selected(); +} + +bool DbMTermDescriptor::lessThan(std::any l, std::any r) const +{ + auto l_mterm = std::any_cast(l); + auto r_mterm = std::any_cast(r); + return l_mterm->getId() < r_mterm->getId(); +} + +bool DbMTermDescriptor::getAllObjects(SelectionSet& objects) const +{ + for (auto* lib : db_->getLibs()) { + for (auto* master : lib->getMasters()) { + for (auto* mterm : master->getMTerms()) { + objects.insert(makeSelected(mterm)); + } + } + } + + return true; +} + +////////////////////////////////////////////////// + DbViaDescriptor::DbViaDescriptor(odb::dbDatabase* db) : db_(db) { } diff --git a/src/gui/src/dbDescriptors.h b/src/gui/src/dbDescriptors.h index ea98fd0ee5f..878af9daa96 100644 --- a/src/gui/src/dbDescriptors.h +++ b/src/gui/src/dbDescriptors.h @@ -272,6 +272,28 @@ class DbBTermDescriptor : public Descriptor odb::dbDatabase* db_; }; +class DbMTermDescriptor : public Descriptor +{ + public: + DbMTermDescriptor(odb::dbDatabase* db); + + std::string getName(std::any object) const override; + std::string getShortName(std::any object) const override; + std::string getTypeName() const override; + bool getBBox(std::any object, odb::Rect& bbox) const override; + + void highlight(std::any object, Painter& painter) const override; + + Properties getProperties(std::any object) const override; + Selected makeSelected(std::any object) const override; + bool lessThan(std::any l, std::any r) const override; + + bool getAllObjects(SelectionSet& objects) const override; + + private: + odb::dbDatabase* db_; +}; + class DbViaDescriptor : public Descriptor { public: diff --git a/src/gui/src/displayControls.cpp b/src/gui/src/displayControls.cpp index c084f7d9efa..3e5a24ee382 100644 --- a/src/gui/src/displayControls.cpp +++ b/src/gui/src/displayControls.cpp @@ -264,6 +264,7 @@ DisplayControls::DisplayControls(QWidget* parent) : QDockWidget("Display Control", parent), view_(new QTreeView(this)), model_(new DisplayControlModel(user_data_item_idx_, this)), + routing_layers_menu_(new QMenu(this)), layers_menu_(new QMenu(this)), layers_menu_layer_(nullptr), ignore_callback_(false), @@ -295,6 +296,16 @@ DisplayControls::DisplayControls(QWidget* parent) auto layers = makeParentItem(layers_group_, "Layers", root, Qt::Checked, true); view_->expand(layers->index()); + auto implant_layer + = makeParentItem(layers_.implant, "Implant", layers, Qt::Checked, true); + auto master_layer = makeParentItem( + layers_.master, "Masterslice", layers, Qt::Unchecked, true); + auto other_layer + = makeParentItem(layers_.other, "Other", layers, Qt::Unchecked, true); + // hide initially + view_->setRowHidden(implant_layer->row(), layers->index(), true); + view_->setRowHidden(master_layer->row(), layers->index(), true); + view_->setRowHidden(other_layer->row(), layers->index(), true); // Nets group auto nets_parent @@ -556,6 +567,10 @@ void DisplayControls::createLayerMenu() &QAction::triggered, [this]() { layerShowOnlySelectedNeighbors(0, 0); }); + connect(routing_layers_menu_->addAction("Show only selected"), + &QAction::triggered, + [this]() { layerShowOnlySelectedNeighbors(0, 0); }); + const QString show_range = "Show layer range "; const QString updown_arrow = "\u2195"; const QString down_arrow = "\u2193"; @@ -576,7 +591,7 @@ void DisplayControls::createLayerMenu() arrows += down_arrow; } - connect(layers_menu_->addAction(show_range + arrows), + connect(routing_layers_menu_->addAction(show_range + arrows), &QAction::triggered, [this, up, down]() { layerShowOnlySelectedNeighbors(down, up); }); }; @@ -1205,18 +1220,54 @@ void DisplayControls::addTech(odb::dbTech* tech) libInit(tech->getDb()); for (dbTechLayer* layer : tech->getLayers()) { - dbTechLayerType type = layer->getType(); - if (type == dbTechLayerType::ROUTING || type == dbTechLayerType::CUT - || type == dbTechLayerType::IMPLANT) { - auto& row = layer_controls_[layer]; - makeLeafItem(row, - QString::fromStdString(layer->getName()), - layers_group_.name, - Qt::Checked, - true, - color(layer), - QVariant::fromValue(layer)); + auto& row = layer_controls_[layer]; + QStandardItem* parent; + Qt::CheckState checked; + switch (layer->getType()) { + case dbTechLayerType::ROUTING: + case dbTechLayerType::CUT: + parent = layers_group_.name; + checked = Qt::Checked; + break; + case dbTechLayerType::MASTERSLICE: + parent = layers_.master.name; + checked = Qt::Unchecked; + break; + case dbTechLayerType::IMPLANT: + parent = layers_.implant.name; + checked = Qt::Checked; + break; + default: + parent = layers_.other.name; + checked = Qt::Unchecked; + break; } + makeLeafItem(row, + QString::fromStdString(layer->getName()), + parent, + checked, + true, + color(layer), + QVariant::fromValue(layer)); + } + + if (layers_.implant.name->hasChildren()) { + view_->setRowHidden(layers_.implant.name->row(), + layers_group_.name->index(), + !layers_.implant.name->hasChildren()); + toggleParent(layers_.implant); + } + if (layers_.master.name->hasChildren()) { + view_->setRowHidden(layers_.master.name->row(), + layers_group_.name->index(), + !layers_.master.name->hasChildren()); + toggleParent(layers_.master); + } + if (layers_.other.name->hasChildren()) { + view_->setRowHidden(layers_.other.name->row(), + layers_group_.name->index(), + !layers_.other.name->hasChildren()); + toggleParent(layers_.other); } toggleParent(layers_group_); @@ -1919,14 +1970,12 @@ void DisplayControls::techInit(odb::dbTech* tech) 50 + gen_color() % 200, 50 + gen_color() % 200); } - } else if (type == dbTechLayerType::IMPLANT) { + } else { // Do not draw from the existing palette so the metal layers can claim // those colors. color = QColor(50 + gen_color() % 200, 50 + gen_color() % 200, 50 + gen_color() % 200); - } else { - continue; } color.setAlpha(180); layer_color_[layer] = std::move(color); @@ -2009,18 +2058,22 @@ void DisplayControls::itemContextMenu(const QPoint& point) return; } - auto* parent_item = model_->itemFromIndex(parent); - if (parent_item != layers_group_.name) { - // not a member of the layers - return; - } - const QModelIndex name_index = model_->index(index.row(), Name, parent); auto* name_item = model_->itemFromIndex(name_index); layers_menu_layer_ = name_item->data(user_data_item_idx_).value(); - layers_menu_->popup(view_->viewport()->mapToGlobal(point)); + if (layers_menu_layer_ != nullptr) { + switch (layers_menu_layer_->getType()) { + case dbTechLayerType::CUT: + case dbTechLayerType::ROUTING: + routing_layers_menu_->popup(view_->viewport()->mapToGlobal(point)); + break; + default: + layers_menu_->popup(view_->viewport()->mapToGlobal(point)); + break; + } + } } void DisplayControls::layerShowOnlySelectedNeighbors(int lower, int upper) diff --git a/src/gui/src/displayControls.h b/src/gui/src/displayControls.h index 42652430f37..0a3ddbbcf41 100644 --- a/src/gui/src/displayControls.h +++ b/src/gui/src/displayControls.h @@ -312,6 +312,13 @@ class DisplayControls : public QDockWidget, ModelRow clock; }; + struct LayerModels + { + ModelRow implant; + ModelRow master; + ModelRow other; + }; + struct InstanceModels { ModelRow stdcells; @@ -495,6 +502,7 @@ class DisplayControls : public QDockWidget, QTreeView* view_; DisplayControlModel* model_; + QMenu* routing_layers_menu_; QMenu* layers_menu_; odb::dbTechLayer* layers_menu_layer_; @@ -514,6 +522,7 @@ class DisplayControls : public QDockWidget, ModelRow shape_type_group_; // instances + LayerModels layers_; InstanceModels instances_; StdCellModels stdcell_instances_; BufferInverterModels bufinv_instances_; diff --git a/src/gui/src/layoutViewer.cpp b/src/gui/src/layoutViewer.cpp index efae85b83cd..2c7e44eacc1 100644 --- a/src/gui/src/layoutViewer.cpp +++ b/src/gui/src/layoutViewer.cpp @@ -1328,10 +1328,6 @@ void LayoutViewer::boxesByLayer(dbMaster* master, LayerBoxes& boxes) for (dbBox* box : master->getObstructions()) { dbTechLayer* layer = box->getTechLayer(); dbTechLayerType type = layer->getType(); - if (type != dbTechLayerType::ROUTING && type != dbTechLayerType::CUT - && type != dbTechLayerType::IMPLANT) { - continue; - } boxes[layer].obs.emplace_back(box_to_qrect(box)); } @@ -1350,10 +1346,6 @@ void LayoutViewer::boxesByLayer(dbMaster* master, LayerBoxes& boxes) odb::Rect box_rect = via_box->getBox(); dbTechLayer* layer = via_box->getTechLayer(); dbTechLayerType type = layer->getType(); - if (type != dbTechLayerType::ROUTING - && type != dbTechLayerType::CUT) { - continue; - } via_transform.apply(box_rect); boxes[layer].mterms.emplace_back( QRect{box_rect.xMin(), @@ -1364,10 +1356,6 @@ void LayoutViewer::boxesByLayer(dbMaster* master, LayerBoxes& boxes) } else { dbTechLayer* layer = box->getTechLayer(); dbTechLayerType type = layer->getType(); - if (type != dbTechLayerType::ROUTING - && type != dbTechLayerType::CUT) { - continue; - } boxes[layer].mterms.emplace_back(box_to_qrect(box)); } } diff --git a/src/gui/src/mainWindow.cpp b/src/gui/src/mainWindow.cpp index 91fbc4048d7..d74072a4979 100644 --- a/src/gui/src/mainWindow.cpp +++ b/src/gui/src/mainWindow.cpp @@ -479,6 +479,7 @@ void MainWindow::init(sta::dbSta* sta) viewers_->getNetTracks())); gui->registerDescriptor(new DbITermDescriptor(db_)); gui->registerDescriptor(new DbBTermDescriptor(db_)); + gui->registerDescriptor(new DbMTermDescriptor(db_)); gui->registerDescriptor(new DbViaDescriptor(db_)); gui->registerDescriptor(new DbBlockageDescriptor(db_)); gui->registerDescriptor( diff --git a/src/mpl2/src/hier_rtlmp.cpp b/src/mpl2/src/hier_rtlmp.cpp index 6d0bbc74739..ea734934c02 100644 --- a/src/mpl2/src/hier_rtlmp.cpp +++ b/src/mpl2/src/hier_rtlmp.cpp @@ -55,6 +55,11 @@ namespace mpl2 { using std::string; +static string make_filename(const string& file_name) +{ + return std::regex_replace(file_name, std::regex("[\":<>\\|\\*\\?/]"), "--"); +} + /////////////////////////////////////////////////////////// // Class HierRTLMP using utl::MPL; @@ -1544,11 +1549,8 @@ void HierRTLMP::runHierarchicalMacroPlacement(Cluster* parent) // Write the connections between macros std::ofstream file; std::string file_name = parent->getName(); - for (auto& c : file_name) { - if (c == '/') { - c = '*'; - } - } + file_name = make_filename(file_name); + file_name = report_directory_ + "/" + file_name; file.open(file_name + "net.txt"); for (auto& net : nets) { @@ -2378,11 +2380,8 @@ void HierRTLMP::runHierarchicalMacroPlacementWithoutBusPlanning(Cluster* parent) // Write the connections between macros std::ofstream file; std::string file_name = parent->getName(); - for (auto& c : file_name) { - if (c == '/') { - c = '*'; - } - } + file_name = make_filename(file_name); + file_name = report_directory_ + "/" + file_name; file.open(file_name + ".net.txt"); for (auto& net : nets) { @@ -2880,11 +2879,8 @@ void HierRTLMP::runEnhancedHierarchicalMacroPlacement(Cluster* parent) // Write the connections between macros std::ofstream file; std::string file_name = parent->getName(); - for (auto& c : file_name) { - if (c == '/') { - c = '*'; - } - } + file_name = make_filename(file_name); + file_name = report_directory_ + "/" + file_name; file.open(file_name + ".net.txt"); for (auto& net : nets) { diff --git a/src/odb/src/db/dbBox.cpp b/src/odb/src/db/dbBox.cpp index b7c1daa4563..1628f28508b 100644 --- a/src/odb/src/db/dbBox.cpp +++ b/src/odb/src/db/dbBox.cpp @@ -94,10 +94,10 @@ bool _dbBox::operator==(const _dbBox& rhs) const if (_flags._octilinear != rhs._flags._octilinear) { return false; } - if (isOct() && _shape._oct != _shape._oct) { + if (isOct() && _shape._oct != rhs._shape._oct) { return false; } - if (_shape._rect != _shape._rect) { + if (_shape._rect != rhs._shape._rect) { return false; } @@ -163,10 +163,10 @@ int _dbBox::equal(const _dbBox& rhs) const if (design_rule_width_ != rhs.design_rule_width_) { return false; } - if (isOct() && _shape._oct != _shape._oct) { + if (isOct() && _shape._oct != rhs._shape._oct) { return false; } - if (_shape._rect != _shape._rect) { + if (_shape._rect != rhs._shape._rect) { return false; } diff --git a/src/psm/src/ir_network.cpp b/src/psm/src/ir_network.cpp index f4287e38f02..570c00d1cad 100644 --- a/src/psm/src/ir_network.cpp +++ b/src/psm/src/ir_network.cpp @@ -260,6 +260,11 @@ IRNetwork::generatePolygonsFromITerms(std::vector& terminals) continue; } const auto transform = inst->getTransform(); + if (iterm->getBBox().isInverted()) { + // iterm has no physical shape, so ignore. + continue; + } + int x, y; iterm->getAvgXY(&x, &y); auto base_node diff --git a/src/psm/test/insert_decap1.tcl b/src/psm/test/insert_decap1.tcl index 8886a381562..db7d98f1035 100644 --- a/src/psm/test/insert_decap1.tcl +++ b/src/psm/test/insert_decap1.tcl @@ -4,7 +4,7 @@ source "helpers.tcl" read_liberty sky130hd/sky130_fd_sc_hd__ss_n40C_1v40.lib read_lef "sky130hd/sky130hd.tlef" read_lef "sky130hd/sky130hd_std_cell.lef" -read_def "insert_decap_gcd.def" +read_def "sky130hd_data/insert_decap_gcd.def" source sky130hd/sky130hd.rc diff --git a/src/psm/test/insert_decap2.tcl b/src/psm/test/insert_decap2.tcl index 481588a970b..11c1578b1d8 100644 --- a/src/psm/test/insert_decap2.tcl +++ b/src/psm/test/insert_decap2.tcl @@ -8,7 +8,7 @@ read_liberty sky130hd/sky130_fd_sc_hd__ss_n40C_1v40.lib source sky130hd/sky130hd.rc -read_def "insert_decap_gcd.def" +read_def "sky130hd_data/insert_decap_gcd.def" analyze_power_grid -net {VDD} insert_decap -target_cap 10.5 -cells {"sky130_fd_sc_hd__decap_3" 2.5} diff --git a/src/psm/test/save_defok b/src/psm/test/save_defok new file mode 120000 index 00000000000..899db325246 --- /dev/null +++ b/src/psm/test/save_defok @@ -0,0 +1 @@ +../../../test/shared/save_defok \ No newline at end of file diff --git a/src/psm/test/insert_decap_gcd.def b/src/psm/test/sky130hd_data/insert_decap_gcd.def similarity index 100% rename from src/psm/test/insert_decap_gcd.def rename to src/psm/test/sky130hd_data/insert_decap_gcd.def diff --git a/src/rcx/src/ext.cpp b/src/rcx/src/ext.cpp index a60b5d6e5e6..eb4f1f389c2 100644 --- a/src/rcx/src/ext.cpp +++ b/src/rcx/src/ext.cpp @@ -234,8 +234,6 @@ void Ext::extract(ExtractOptions options) { _ext->setBlockFromChip(); odb::dbBlock* block = _ext->getBlock(); - logger_->info( - RCX, 8, "extracting parasitics of {} ...", block->getConstName()); odb::orderWires(logger_, block); @@ -250,9 +248,6 @@ void Ext::extract(ExtractOptions options) options.coupling_threshold, options.context_depth, options.ext_model_file); - - logger_->info( - RCX, 15, "Finished extracting {}.", _ext->getBlock()->getName().c_str()); } void Ext::adjust_rc(float res_factor, float cc_factor, float gndc_factor) @@ -288,9 +283,6 @@ void Ext::write_spef(const SpefOptions& options) spef_version_); return; } - if (!options.init) { - logger_->info(RCX, 16, "Writing SPEF ..."); - } _ext->writeSPEF((char*) options.file, (char*) options.nets, options.no_name_map, @@ -313,8 +305,6 @@ void Ext::write_spef(const SpefOptions& options) name, spef_version_, options.parallel); - - logger_->info(RCX, 17, "Finished writing SPEF ..."); } void Ext::read_spef(ReadSpefOpts& opt) diff --git a/src/rcx/src/extFlow.cpp b/src/rcx/src/extFlow.cpp index bccc624606e..e9bae029f25 100644 --- a/src/rcx/src/extFlow.cpp +++ b/src/rcx/src/extFlow.cpp @@ -1229,8 +1229,6 @@ uint extMain::couplingFlow(Rect& extRect, uint totWireCnt = signalWireCounter(maxWidth); totWireCnt += totPowerWireCnt; - logger_->info(RCX, 43, "{} wires to be extracted", totWireCnt); - uint minRes[2]; minRes[1] = pitchTable[1]; minRes[0] = widthTable[1]; @@ -1348,12 +1346,14 @@ uint extMain::couplingFlow(Rect& extRect, = lround(100.0 * (1.0 * totalWiresExtracted / totWireCnt)); if ((totWireCnt > 0) && (totalWiresExtracted > 0) - && (percent_extracted - _previous_percent_extracted >= 5.0)) { + && (((totWireCnt == totalWiresExtracted) + && (percent_extracted > _previous_percent_extracted)) + || (percent_extracted - _previous_percent_extracted >= 5.0))) { logger_->info(RCX, 442, - "{:d}% completion -- {:d} wires have been extracted", + "{:d}% of {:d} wires extracted", (int) (100.0 * (1.0 * totalWiresExtracted / totWireCnt)), - totalWiresExtracted); + totWireCnt); _previous_percent_extracted = percent_extracted; } diff --git a/src/rcx/test/45_gcd.ok b/src/rcx/test/45_gcd.ok index 23c6e49a3b6..a1abc1b3af9 100644 --- a/src/rcx/test/45_gcd.ok +++ b/src/rcx/test/45_gcd.ok @@ -6,18 +6,13 @@ [INFO ODB-0133] Created 350 nets and 978 connections. [INFO RCX-0431] Defined process_corner X with ext_model_index 0 [INFO RCX-0029] Defined extraction corner X -[INFO RCX-0008] extracting parasitics of gcd ... [INFO RCX-0435] Reading extraction model file 45_patterns.rules ... [INFO RCX-0436] RC segment generation gcd (max_merge_res 0.0) ... [INFO RCX-0040] Final 2656 rc segments [INFO RCX-0439] Coupling Cap extraction gcd ... [INFO RCX-0440] Coupling threshhold is 0.1000 fF, coupling capacitance less than 0.1000 fF will be grounded. -[INFO RCX-0043] 1954 wires to be extracted -[INFO RCX-0442] 48% completion -- 954 wires have been extracted -[INFO RCX-0442] 100% completion -- 1954 wires have been extracted +[INFO RCX-0442] 48% of 1954 wires extracted +[INFO RCX-0442] 100% of 1954 wires extracted [INFO RCX-0045] Extract 350 nets, 2972 rsegs, 2972 caps, 2876 ccs -[INFO RCX-0015] Finished extracting gcd. -[INFO RCX-0016] Writing SPEF ... [INFO RCX-0443] 350 nets finished -[INFO RCX-0017] Finished writing SPEF ... No differences found. diff --git a/src/rcx/test/ext_pattern.ok b/src/rcx/test/ext_pattern.ok index 22f4050145f..41c252b5dfa 100644 --- a/src/rcx/test/ext_pattern.ok +++ b/src/rcx/test/ext_pattern.ok @@ -4,22 +4,18 @@ [INFO ODB-0133] Created 70552 nets and 0 connections. [INFO RCX-0431] Defined process_corner X with ext_model_index 0 [INFO RCX-0029] Defined extraction corner X -[INFO RCX-0008] extracting parasitics of blk ... [INFO RCX-0435] Reading extraction model file ext_pattern.rules ... [INFO RCX-0436] RC segment generation blk (max_merge_res 0.0) ... [INFO RCX-0040] Final 70552 rc segments [INFO RCX-0439] Coupling Cap extraction blk ... [INFO RCX-0440] Coupling threshhold is 0.1000 fF, coupling capacitance less than 0.1000 fF will be grounded. -[INFO RCX-0043] 70552 wires to be extracted -[INFO RCX-0442] 28% completion -- 20072 wires have been extracted -[INFO RCX-0442] 36% completion -- 25945 wires have been extracted -[INFO RCX-0442] 75% completion -- 53088 wires have been extracted -[INFO RCX-0442] 81% completion -- 57308 wires have been extracted -[INFO RCX-0442] 85% completion -- 60420 wires have been extracted -[INFO RCX-0442] 95% completion -- 67547 wires have been extracted +[INFO RCX-0442] 28% of 70552 wires extracted +[INFO RCX-0442] 36% of 70552 wires extracted +[INFO RCX-0442] 75% of 70552 wires extracted +[INFO RCX-0442] 81% of 70552 wires extracted +[INFO RCX-0442] 85% of 70552 wires extracted +[INFO RCX-0442] 95% of 70552 wires extracted +[INFO RCX-0442] 100% of 70552 wires extracted [INFO RCX-0045] Extract 70550 nets, 141104 rsegs, 141104 caps, 68533 ccs -[INFO RCX-0015] Finished extracting blk. -[INFO RCX-0016] Writing SPEF ... [INFO RCX-0443] 9 nets finished -[INFO RCX-0017] Finished writing SPEF ... No differences found. diff --git a/src/rcx/test/gcd.ok b/src/rcx/test/gcd.ok index 49fd2c85da4..5467a556ba1 100644 --- a/src/rcx/test/gcd.ok +++ b/src/rcx/test/gcd.ok @@ -7,18 +7,13 @@ [INFO ODB-0133] Created 411 nets and 1210 connections. [INFO RCX-0431] Defined process_corner X with ext_model_index 0 [INFO RCX-0029] Defined extraction corner X -[INFO RCX-0008] extracting parasitics of gcd ... [INFO RCX-0435] Reading extraction model file ext_pattern.rules ... [INFO RCX-0436] RC segment generation gcd (max_merge_res 0.0) ... [INFO RCX-0040] Final 3221 rc segments [INFO RCX-0439] Coupling Cap extraction gcd ... [INFO RCX-0440] Coupling threshhold is 0.1000 fF, coupling capacitance less than 0.1000 fF will be grounded. -[INFO RCX-0043] 2368 wires to be extracted -[INFO RCX-0442] 50% completion -- 1197 wires have been extracted -[INFO RCX-0442] 100% completion -- 2368 wires have been extracted +[INFO RCX-0442] 50% of 2368 wires extracted +[INFO RCX-0442] 100% of 2368 wires extracted [INFO RCX-0045] Extract 411 nets, 3632 rsegs, 3632 caps, 2237 ccs -[INFO RCX-0015] Finished extracting gcd. -[INFO RCX-0016] Writing SPEF ... [INFO RCX-0443] 411 nets finished -[INFO RCX-0017] Finished writing SPEF ... No differences found. diff --git a/src/rcx/test/names.ok b/src/rcx/test/names.ok index d7035ae4ccb..ac3f1ce5056 100644 --- a/src/rcx/test/names.ok +++ b/src/rcx/test/names.ok @@ -67,16 +67,11 @@ [INFO DRT-0179] Init gr pin query. [INFO RCX-0431] Defined process_corner X with ext_model_index 0 [INFO RCX-0029] Defined extraction corner X -[INFO RCX-0008] extracting parasitics of top ... [INFO RCX-0435] Reading extraction model file Nangate45/Nangate45.rcx_rules ... [INFO RCX-0436] RC segment generation top (max_merge_res 50.0) ... [INFO RCX-0040] Final 1 rc segments [INFO RCX-0439] Coupling Cap extraction top ... [INFO RCX-0440] Coupling threshhold is 0.1000 fF, coupling capacitance less than 0.1000 fF will be grounded. -[INFO RCX-0043] 3 wires to be extracted -[INFO RCX-0442] 100% completion -- 3 wires have been extracted +[INFO RCX-0442] 100% of 3 wires extracted [INFO RCX-0045] Extract -1 nets, 2 rsegs, 2 caps, 0 ccs -[INFO RCX-0015] Finished extracting top. -[INFO RCX-0016] Writing SPEF ... [INFO RCX-0443] 1 nets finished -[INFO RCX-0017] Finished writing SPEF ...