<p>The algorithm top-level is implemented in the <code><aclass="el"href="classKite_1_1NegociateWindow.html"title="Perform the routing, main RoutingEvent manager. ">NegociateWindow</a></code>.</p>
Load routing wires (<code>AutoSegment</code>) from <code>KatabaticEngine</code> inside the <aclass="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>
<pclass="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>
<pclass="endli">GCellRoutingSet receive an increasing order number. The higher the order the lower the density. This order is transmitted to the <code><aclass="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>
<p>For each <code>GCellRoutingSet</code> in decreasing density, negociate the set of associated <code><aclass="el"href="classKite_1_1TrackSegment.html"title="Derived Katabatic::AutoSegment for the router. ">TrackSegment</a></code>. </p><ol>
Build a <code><aclass="el"href="classKite_1_1RoutingEventQueue.html"title="The priority Queue of RoutingEvent. ">RoutingEventQueue</a></code> from the list of <code><aclass="el"href="classKite_1_1TrackSegment.html"title="Derived Katabatic::AutoSegment for the router. ">TrackSegment</a></code>. The queue is responsible for allocating the <code><aclass="el"href="classKite_1_1RoutingEvent.html"title="Atomic Placement Request for a TrackSegment. ">RoutingEvent</a></code> associated to each <code><aclass="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><aclass="el"href="classKite_1_1TrackSegment.html"title="Derived Katabatic::AutoSegment for the router. ">TrackSegment</a></code>. That is, constrained <code><aclass="el"href="classKite_1_1TrackSegment.html"title="Derived Katabatic::AutoSegment for the router. ">TrackSegment</a></code> are routed first. </li>
<li>
<pclass="startli">The queue is processed till it's empty (no unprocessed <code><aclass="el"href="classKite_1_1RoutingEvent.html"title="Atomic Placement Request for a TrackSegment. ">RoutingEvent</a></code> remains).</p>
<p>Processing a <code><aclass="el"href="classKite_1_1RoutingEvent.html"title="Atomic Placement Request for a TrackSegment. ">RoutingEvent</a></code> is trying to insert a <code><aclass="el"href="classKite_1_1TrackSegment.html"title="Derived Katabatic::AutoSegment for the router. ">TrackSegment</a></code> in a suitable <aclass="el"href="classKite_1_1Track.html"title="Structure managing one routing track. ">Track</a>. We proceed as follow : </p><ul>
The maximum ripup count for the to be inserted segment has been reached. Issue a severe warning and left unrouted this <code><aclass="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><aclass="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>
<pclass="startli">Now consider the lower cost <code><aclass="el"href="classKite_1_1Track.html"title="Structure managing one routing track. ">Track</a></code>. If there is a free interval for the <code><aclass="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><aclass="el"href="classKite_1_1TrackSegment.html"title="Derived Katabatic::AutoSegment for the router. ">TrackSegment</a></code> already in the <code><aclass="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><aclass="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><aclass="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><aclass="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 <aclass="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><aclass="el"href="classKite_1_1TrackSegment.html"title="Derived Katabatic::AutoSegment for the router. ">TrackSegment</a></code> itself has it do not change of <aclass="el"href="classKite_1_1Track.html"title="Structure managing one routing track. ">Track</a>.</p>
<pclass="endli">If there is a <em>"hard overlap"</em>, that is the two <code><aclass="el"href="classKite_1_1TrackSegment.html"title="Derived Katabatic::AutoSegment for the router. ">TrackSegment</a></code> cannot share the same <code><aclass="el"href="classKite_1_1Track.html"title="Structure managing one routing track. ">Track</a></code>, remove the previous one from the <code><aclass="el"href="classKite_1_1Track.html"title="Structure managing one routing track. ">Track</a></code> and re-post a <code><aclass="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><aclass="el"href="classKite_1_1TrackSegment.html"title="Derived Katabatic::AutoSegment for the router. ">TrackSegment</a></code> which could be ripped-up. Otherwise the <code><aclass="el"href="classKite_1_1Track.html"title="Structure managing one routing track. ">Track</a></code> would'nt even be a candidate. </p>
</li>
</ul>
<pclass="endli">When a <aclass="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>