coriolis/kite/doc/latex/group__AlgorithmOverview.tex

41 lines
5.1 KiB
TeX

\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 \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 \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 \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 \hyperlink{classKite_1_1TrackSegment}{Track\+Segment}}.
\begin{DoxyEnumerate}
\item Build a {\ttfamily \hyperlink{classKite_1_1RoutingEventQueue}{Routing\+Event\+Queue}} from the list of {\ttfamily \hyperlink{classKite_1_1TrackSegment}{Track\+Segment}}. The queue is responsible for allocating the {\ttfamily \hyperlink{classKite_1_1RoutingEvent}{Routing\+Event}} associated to each {\ttfamily \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 \hyperlink{classKite_1_1TrackSegment}{Track\+Segment}}. That is, constrained {\ttfamily \hyperlink{classKite_1_1TrackSegment}{Track\+Segment}} are routed first.
\item The queue is processed till it\textquotesingle{}s empty (no unprocessed {\ttfamily \hyperlink{classKite_1_1RoutingEvent}{Routing\+Event}} remains).
Processing a {\ttfamily \hyperlink{classKite_1_1RoutingEvent}{Routing\+Event}} is trying to insert a {\ttfamily \hyperlink{classKite_1_1TrackSegment}{Track\+Segment}} in a suitable \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 \hyperlink{classKite_1_1TrackSegment}{Track\+Segment}} (for now).
\item Compute the Tracks in which the {\ttfamily \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 \hyperlink{classKite_1_1Track}{Track}}. If there is a free interval for the {\ttfamily \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 \hyperlink{classKite_1_1TrackSegment}{Track\+Segment}} already in the {\ttfamily \hyperlink{classKite_1_1Track}{Track}} could be shrunk either to the left or the right so the new {\ttfamily \hyperlink{classKite_1_1TrackSegment}{Track\+Segment}} can be inserted. This is managed by {\ttfamily Routing\+Event\+::\+\_\+set\+Aside()}, for each soft overlaping {\ttfamily \hyperlink{classKite_1_1TrackSegment}{Track\+Segment}}, gets its perpandiculars and issue a displacement request for all of them. That is, re-\/post a {\ttfamily \hyperlink{classKite_1_1RoutingEvent}{Routing\+Event}} with updated constraints and remove the perpandicular from it\textquotesingle{}s \hyperlink{classKite_1_1Track}{Track} if it has already been routed. Note that no request is issued for the overlaping {\ttfamily \hyperlink{classKite_1_1TrackSegment}{Track\+Segment}} itself has it do not change of \hyperlink{classKite_1_1Track}{Track}.
If there is a {\itshape \char`\"{}hard overlap\char`\"{}}, that is the two {\ttfamily \hyperlink{classKite_1_1TrackSegment}{Track\+Segment}} cannot share the same {\ttfamily \hyperlink{classKite_1_1Track}{Track}}, remove the previous one from the {\ttfamily \hyperlink{classKite_1_1Track}{Track}} and re-\/post a {\ttfamily \hyperlink{classKite_1_1RoutingEvent}{Routing\+Event}}. Note that, the cost object should have selected a {\ttfamily \hyperlink{classKite_1_1TrackSegment}{Track\+Segment}} which could be ripped-\/up. Otherwise the {\ttfamily \hyperlink{classKite_1_1Track}{Track}} would\textquotesingle{}nt even be a candidate.
\end{DoxyItemize}
When a \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}