\hypertarget{group__AlgorithmOverview}{}\subsection{Algorithm Overview}
\label{group__AlgorithmOverview}\index{Algorithm Overview@{Algorithm Overview}}


Description of the algorithm.  


Description of the algorithm. 

The algorithm top-\/level is implemented in the {\ttfamily \mbox{\hyperlink{classKite_1_1NegociateWindow}{Negociate\+Window}}}.

{\bfseries First step~\+:} Negociate\+Window\+::\+\_\+load\+Routing() 
\begin{DoxyEnumerate}
\item Load routing wires ({\ttfamily Auto\+Segment}) from {\ttfamily Katabatic\+Engine} inside the \mbox{\hyperlink{namespaceKite}{Kite}} {\ttfamily G\+Cell\textquotesingle{}s}. Then update the {\ttfamily G\+Cell\textquotesingle{}s} density. 
\item Sort the {\ttfamily G\+Cell\textquotesingle{}s} according to decreasing density (denser {\ttfamily G\+Cell\textquotesingle{}s} are to be routed first). 
\item Agglomerate clusters of contiguous G\+Cell\textquotesingle{}s whose density is superior to 0.\+7 to the seed G\+Cell. See {\ttfamily G\+Cell\+Routing\+Set} for the mechanism.

G\+Cell\+Routing\+Set receive an increasing order number. The higher the order the lower the density. This order is transmitted to the {\ttfamily \mbox{\hyperlink{classKite_1_1TrackSegment}{Track\+Segment}}} of the {\ttfamily G\+Cell\+Routing\+Set} to be taken into account by the track cost function. 
\end{DoxyEnumerate}

{\bfseries Second step~\+:} {\ttfamily Negociate\+Window\+::\+\_\+run\+On\+G\+Cell\+Routing\+Set()} 

For each {\ttfamily G\+Cell\+Routing\+Set} in decreasing density, negociate the set of associated {\ttfamily \mbox{\hyperlink{classKite_1_1TrackSegment}{Track\+Segment}}}. 
\begin{DoxyEnumerate}
\item Build a {\ttfamily \mbox{\hyperlink{classKite_1_1RoutingEventQueue}{Routing\+Event\+Queue}}} from the list of {\ttfamily \mbox{\hyperlink{classKite_1_1TrackSegment}{Track\+Segment}}}. The queue is responsible for allocating the {\ttfamily \mbox{\hyperlink{classKite_1_1RoutingEvent}{Routing\+Event}}} associated to each {\ttfamily \mbox{\hyperlink{classKite_1_1TrackSegment}{Track\+Segment}}}. 
\item The queue is sorted according to the \char`\"{}event level\char`\"{} then to the priority, which is for now the slack of the {\ttfamily \mbox{\hyperlink{classKite_1_1TrackSegment}{Track\+Segment}}}. That is, constrained {\ttfamily \mbox{\hyperlink{classKite_1_1TrackSegment}{Track\+Segment}}} are routed first. 
\item The queue is processed till it\textquotesingle{}s empty (no unprocessed {\ttfamily \mbox{\hyperlink{classKite_1_1RoutingEvent}{Routing\+Event}}} remains).

Processing a {\ttfamily \mbox{\hyperlink{classKite_1_1RoutingEvent}{Routing\+Event}}} is trying to insert a {\ttfamily \mbox{\hyperlink{classKite_1_1TrackSegment}{Track\+Segment}}} in a suitable \mbox{\hyperlink{classKite_1_1Track}{Track}}. We proceed as follow~\+: 
\begin{DoxyItemize}
\item The maximum ripup count for the to be inserted segment has been reached. Issue a severe warning and left unrouted this {\ttfamily \mbox{\hyperlink{classKite_1_1TrackSegment}{Track\+Segment}}} (for now). 
\item Compute the Tracks in which the {\ttfamily \mbox{\hyperlink{classKite_1_1TrackSegment}{Track\+Segment}}} can be inserted, then compute the insertion cost in each one. The candidates are ordered by the insertion cost. 
\item Now consider the lower cost {\ttfamily \mbox{\hyperlink{classKite_1_1Track}{Track}}}. If there is a free interval for the {\ttfamily \mbox{\hyperlink{classKite_1_1TrackSegment}{Track\+Segment}}}. Issue a {\ttfamily Session\+::add\+Insert\+Event()} then finish.

If there is a {\itshape \char`\"{}soft overlap\char`\"{}}, that is the overlaping {\ttfamily \mbox{\hyperlink{classKite_1_1TrackSegment}{Track\+Segment}}} already in the {\ttfamily \mbox{\hyperlink{classKite_1_1Track}{Track}}} could be shrunk either to the left or the right so the new {\ttfamily \mbox{\hyperlink{classKite_1_1TrackSegment}{Track\+Segment}}} can be inserted. This is managed by {\ttfamily Routing\+Event\+::\+\_\+set\+Aside()}, for each soft overlaping {\ttfamily \mbox{\hyperlink{classKite_1_1TrackSegment}{Track\+Segment}}}, gets its perpandiculars and issue a displacement request for all of them. That is, re-\/post a {\ttfamily \mbox{\hyperlink{classKite_1_1RoutingEvent}{Routing\+Event}}} with updated constraints and remove the perpandicular from it\textquotesingle{}s \mbox{\hyperlink{classKite_1_1Track}{Track}} if it has already been routed. Note that no request is issued for the overlaping {\ttfamily \mbox{\hyperlink{classKite_1_1TrackSegment}{Track\+Segment}}} itself has it do not change of \mbox{\hyperlink{classKite_1_1Track}{Track}}.

If there is a {\itshape \char`\"{}hard overlap\char`\"{}}, that is the two {\ttfamily \mbox{\hyperlink{classKite_1_1TrackSegment}{Track\+Segment}}} cannot share the same {\ttfamily \mbox{\hyperlink{classKite_1_1Track}{Track}}}, remove the previous one from the {\ttfamily \mbox{\hyperlink{classKite_1_1Track}{Track}}} and re-\/post a {\ttfamily \mbox{\hyperlink{classKite_1_1RoutingEvent}{Routing\+Event}}}. Note that, the cost object should have selected a {\ttfamily \mbox{\hyperlink{classKite_1_1TrackSegment}{Track\+Segment}}} which could be ripped-\/up. Otherwise the {\ttfamily \mbox{\hyperlink{classKite_1_1Track}{Track}}} would\textquotesingle{}nt even be a candidate. 
\end{DoxyItemize}

When a \mbox{\hyperlink{classKite_1_1TrackSegment}{Track\+Segment}} is riped up, it is re-\/routed immediately afterward. This is done by increasing his event level. 
\end{DoxyEnumerate}