coriolis/kite/doc/html/group__AlgorithmOverview.html

97 lines
9.1 KiB
HTML

<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.0//EN'>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>Kite - Detailed Router</title>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="SoC.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head>
<h1 id="pagetop" class="header">Kite - Detailed Router</h1>
<!--
<center class="header">
<table class="header">
<tr>
<td><a href="customSummary.html">Summary</a></td>
<td><a href="namespaces.html">Namespaces</a></td>
<td><a href="customHierarchy.html">Class Hierarchy</a></td>
<td><a href="annotated.html">Classes</a></td>
<td><a href="functions.html">Member Index</a></td>
</tr>
</table>
</center>
-->
<br>
<body onload="javascript:toggleLevel(1)">
<!-- Generated by Doxygen 1.8.14 -->
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',false,false,'search.php','Search');
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<div class="header">
<div class="headertitle">
<div class="title">Algorithm Overview</div> </div>
</div><!--header-->
<div class="contents">
<p>Description of the algorithm.
<a href="#details">More...</a></p>
<p>Description of the algorithm. </p>
<p>The algorithm top-level is implemented in the <code><a class="el" href="classKite_1_1NegociateWindow.html" title="Perform the routing, main RoutingEvent manager. ">NegociateWindow</a></code>.</p>
<p><b>First step&#160;:</b> NegociateWindow::_loadRouting() </p><ol>
<li>
Load routing wires (<code>AutoSegment</code>) from <code>KatabaticEngine</code> inside the <a class="el" href="namespaceKite.html" title="The namespace dedicated to Kite. ">Kite</a> <code>GCell's</code>. Then update the <code>GCell's</code> density. </li>
<li>
Sort the <code>GCell's</code> according to decreasing density (denser <code>GCell's</code> are to be routed first). </li>
<li>
<p class="startli">Agglomerate clusters of contiguous GCell's whose density is superior to 0.7 to the seed GCell. See <code>GCellRoutingSet</code> for the mechanism.</p>
<p class="endli">GCellRoutingSet receive an increasing order number. The higher the order the lower the density. This order is transmitted to the <code><a class="el" href="classKite_1_1TrackSegment.html" title="Derived Katabatic::AutoSegment for the router. ">TrackSegment</a></code> of the <code>GCellRoutingSet</code> to be taken into account by the track cost function. </p>
</li>
</ol>
<p><b>Second step&#160;:</b> <code>NegociateWindow::_runOnGCellRoutingSet()</code> </p>
<p>For each <code>GCellRoutingSet</code> in decreasing density, negociate the set of associated <code><a class="el" href="classKite_1_1TrackSegment.html" title="Derived Katabatic::AutoSegment for the router. ">TrackSegment</a></code>. </p><ol>
<li>
Build a <code><a class="el" href="classKite_1_1RoutingEventQueue.html" title="The priority Queue of RoutingEvent. ">RoutingEventQueue</a></code> from the list of <code><a class="el" href="classKite_1_1TrackSegment.html" title="Derived Katabatic::AutoSegment for the router. ">TrackSegment</a></code>. The queue is responsible for allocating the <code><a class="el" href="classKite_1_1RoutingEvent.html" title="Atomic Placement Request for a TrackSegment. ">RoutingEvent</a></code> associated to each <code><a class="el" href="classKite_1_1TrackSegment.html" title="Derived Katabatic::AutoSegment for the router. ">TrackSegment</a></code>. </li>
<li>
The queue is sorted according to the "event level" then to the priority, which is for now the slack of the <code><a class="el" href="classKite_1_1TrackSegment.html" title="Derived Katabatic::AutoSegment for the router. ">TrackSegment</a></code>. That is, constrained <code><a class="el" href="classKite_1_1TrackSegment.html" title="Derived Katabatic::AutoSegment for the router. ">TrackSegment</a></code> are routed first. </li>
<li>
<p class="startli">The queue is processed till it's empty (no unprocessed <code><a class="el" href="classKite_1_1RoutingEvent.html" title="Atomic Placement Request for a TrackSegment. ">RoutingEvent</a></code> remains).</p>
<p>Processing a <code><a class="el" href="classKite_1_1RoutingEvent.html" title="Atomic Placement Request for a TrackSegment. ">RoutingEvent</a></code> is trying to insert a <code><a class="el" href="classKite_1_1TrackSegment.html" title="Derived Katabatic::AutoSegment for the router. ">TrackSegment</a></code> in a suitable <a class="el" href="classKite_1_1Track.html" title="Structure managing one routing track. ">Track</a>. We proceed as follow&#160;: </p><ul>
<li>
The maximum ripup count for the to be inserted segment has been reached. Issue a severe warning and left unrouted this <code><a class="el" href="classKite_1_1TrackSegment.html" title="Derived Katabatic::AutoSegment for the router. ">TrackSegment</a></code> (for now). </li>
<li>
Compute the Tracks in which the <code><a class="el" href="classKite_1_1TrackSegment.html" title="Derived Katabatic::AutoSegment for the router. ">TrackSegment</a></code> can be inserted, then compute the insertion cost in each one. The candidates are ordered by the insertion cost. </li>
<li>
<p class="startli">Now consider the lower cost <code><a class="el" href="classKite_1_1Track.html" title="Structure managing one routing track. ">Track</a></code>. If there is a free interval for the <code><a class="el" href="classKite_1_1TrackSegment.html" title="Derived Katabatic::AutoSegment for the router. ">TrackSegment</a></code>. Issue a <code>Session::addInsertEvent()</code> then finish.</p>
<p>If there is a <em>"soft overlap"</em>, that is the overlaping <code><a class="el" href="classKite_1_1TrackSegment.html" title="Derived Katabatic::AutoSegment for the router. ">TrackSegment</a></code> already in the <code><a class="el" href="classKite_1_1Track.html" title="Structure managing one routing track. ">Track</a></code> could be shrunk either to the left or the right so the new <code><a class="el" href="classKite_1_1TrackSegment.html" title="Derived Katabatic::AutoSegment for the router. ">TrackSegment</a></code> can be inserted. This is managed by <code>RoutingEvent::_setAside()</code>, for each soft overlaping <code><a class="el" href="classKite_1_1TrackSegment.html" title="Derived Katabatic::AutoSegment for the router. ">TrackSegment</a></code>, gets its perpandiculars and issue a displacement request for all of them. That is, re-post a <code><a class="el" href="classKite_1_1RoutingEvent.html" title="Atomic Placement Request for a TrackSegment. ">RoutingEvent</a></code> with updated constraints and remove the perpandicular from it's <a class="el" href="classKite_1_1Track.html" title="Structure managing one routing track. ">Track</a> if it has already been routed. Note that no request is issued for the overlaping <code><a class="el" href="classKite_1_1TrackSegment.html" title="Derived Katabatic::AutoSegment for the router. ">TrackSegment</a></code> itself has it do not change of <a class="el" href="classKite_1_1Track.html" title="Structure managing one routing track. ">Track</a>.</p>
<p class="endli">If there is a <em>"hard overlap"</em>, that is the two <code><a class="el" href="classKite_1_1TrackSegment.html" title="Derived Katabatic::AutoSegment for the router. ">TrackSegment</a></code> cannot share the same <code><a class="el" href="classKite_1_1Track.html" title="Structure managing one routing track. ">Track</a></code>, remove the previous one from the <code><a class="el" href="classKite_1_1Track.html" title="Structure managing one routing track. ">Track</a></code> and re-post a <code><a class="el" href="classKite_1_1RoutingEvent.html" title="Atomic Placement Request for a TrackSegment. ">RoutingEvent</a></code>. Note that, the cost object should have selected a <code><a class="el" href="classKite_1_1TrackSegment.html" title="Derived Katabatic::AutoSegment for the router. ">TrackSegment</a></code> which could be ripped-up. Otherwise the <code><a class="el" href="classKite_1_1Track.html" title="Structure managing one routing track. ">Track</a></code> would'nt even be a candidate. </p>
</li>
</ul>
<p class="endli">When a <a class="el" href="classKite_1_1TrackSegment.html" title="Derived Katabatic::AutoSegment for the router. ">TrackSegment</a> is riped up, it is re-routed immediately afterward. This is done by increasing his event level. </p>
</li>
</ol>
</div><!-- contents -->
<br>
<hr>
<table class="footer1">
<tr>
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Thu Nov 12 2020</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr>
</table>
<table class="footer2">
<tr>
<td class="LFooter">Kite - Detailed Router</td>
<td class="RFooter"><small>Copyright &#169; 2008-2020 Sorbonne Universite. All rights reserved</small></td>
</tr>
</table>
</body>
</html>