coriolis/kite/doc/html/classKite_1_1SegmentFsm.html

941 lines
63 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 id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="namespaceKite.html">Kite</a></li><li class="navelem"><a class="el" href="classKite_1_1SegmentFsm.html">SegmentFsm</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="summary">
<a href="#pub-types">Public Types</a> &#124;
<a href="#pub-methods">Public Member Functions</a> &#124;
<a href="classKite_1_1SegmentFsm-members.html">List of all members</a> </div>
<div class="headertitle">
<div class="title">SegmentFsm Class Reference</div> </div>
</div><!--header-->
<div class="contents">
<p>Pseudo-decorator to process a <a class="el" href="classKite_1_1RoutingEvent.html" title="Atomic Placement Request for a TrackSegment. ">RoutingEvent</a>.
<a href="classKite_1_1SegmentFsm.html#details">More...</a></p>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-types"></a>
Public Types</h2></td></tr>
<tr class="memitem:a5d74787dedbc4e11c1ab15bf487e61f8"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classKite_1_1SegmentFsm.html#a5d74787dedbc4e11c1ab15bf487e61f8">State</a> { <br />
&#160;&#160;<a class="el" href="classKite_1_1SegmentFsm.html#a5d74787dedbc4e11c1ab15bf487e61f8a79ae4f26b8ed9c55b81f981bb5076e1d">MissingData</a> = (1&lt;&lt;0),
<br />
&#160;&#160;<a class="el" href="classKite_1_1SegmentFsm.html#a5d74787dedbc4e11c1ab15bf487e61f8a13ac7e0722ca806ff25d8fa9220e980b">EmptyTrackList</a> = (1&lt;&lt;1),
<br />
&#160;&#160;<a class="el" href="classKite_1_1SegmentFsm.html#a5d74787dedbc4e11c1ab15bf487e61f8abb9adb1672565a2d0c2de07ea840414e">Inserted</a> = (1&lt;&lt;2),
<br />
&#160;&#160;<a class="el" href="classKite_1_1SegmentFsm.html#a5d74787dedbc4e11c1ab15bf487e61f8aacd3ef9d889b306ca7e7bdcd37ba659a">Self</a> = (1&lt;&lt;3),
<br />
&#160;&#160;<a class="el" href="classKite_1_1SegmentFsm.html#a5d74787dedbc4e11c1ab15bf487e61f8a75f0c3176be2226dfe8ad164a0a034a2">Other</a> = (1&lt;&lt;4),
<br />
&#160;&#160;<a class="el" href="classKite_1_1SegmentFsm.html#a5d74787dedbc4e11c1ab15bf487e61f8a08900dc237aef7e4a7f50d2ba1ffd748">Ripup</a> = (1&lt;&lt;5),
<br />
&#160;&#160;<a class="el" href="classKite_1_1SegmentFsm.html#a5d74787dedbc4e11c1ab15bf487e61f8a9fc7197613f3435d906edf69a73acf38">MaximumSlack</a> = (1&lt;&lt;6),
<br />
&#160;&#160;<a class="el" href="classKite_1_1SegmentFsm.html#a5d74787dedbc4e11c1ab15bf487e61f8a8c564779c81599aaadbe879fa2b08d92">SelfInserted</a> = Self | Inserted,
<br />
&#160;&#160;<a class="el" href="classKite_1_1SegmentFsm.html#a5d74787dedbc4e11c1ab15bf487e61f8a22374bab829fac7d12af4784d80eeb6e">OtherRipup</a> = Other | Ripup,
<br />
&#160;&#160;<a class="el" href="classKite_1_1SegmentFsm.html#a5d74787dedbc4e11c1ab15bf487e61f8a560766bb79539564fdeda432c8efae6d">SelfMaximumSlack</a> = Self | MaximumSlack
<br />
}</td></tr>
<tr class="separator:a5d74787dedbc4e11c1ab15bf487e61f8"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
Public Member Functions</h2></td></tr>
<tr class="memitem:a2a8eadaaf3ed213914e7b4a81cae6e6a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classKite_1_1SegmentFsm.html#a2a8eadaaf3ed213914e7b4a81cae6e6a">SegmentFsm</a> (<a class="el" href="classKite_1_1RoutingEvent.html">RoutingEvent</a> *, <a class="el" href="classKite_1_1RoutingEventQueue.html">RoutingEventQueue</a> &amp;, <a class="el" href="classKite_1_1RoutingEventHistory.html">RoutingEventHistory</a> &amp;)</td></tr>
<tr class="separator:a2a8eadaaf3ed213914e7b4a81cae6e6a"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a90fb28e997bec986238b81c0316319f0"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classKite_1_1SegmentFsm.html#a90fb28e997bec986238b81c0316319f0">isFullBlocked</a> () const</td></tr>
<tr class="separator:a90fb28e997bec986238b81c0316319f0"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a513f39c546ef4be0d13787cdace4eadf"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classKite_1_1RoutingEvent.html">RoutingEvent</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classKite_1_1SegmentFsm.html#a513f39c546ef4be0d13787cdace4eadf">getEvent</a> () const</td></tr>
<tr class="separator:a513f39c546ef4be0d13787cdace4eadf"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a3e86badede6ba842280779cecea21e81"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classKite_1_1RoutingEventQueue.html">RoutingEventQueue</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classKite_1_1SegmentFsm.html#a3e86badede6ba842280779cecea21e81">getQueue</a> () const</td></tr>
<tr class="separator:a3e86badede6ba842280779cecea21e81"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a1bf115c7f375168ec89ec400d58440b4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classKite_1_1RoutingEventHistory.html">RoutingEventHistory</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classKite_1_1SegmentFsm.html#a1bf115c7f375168ec89ec400d58440b4">getHistory</a> () const</td></tr>
<tr class="separator:a1bf115c7f375168ec89ec400d58440b4"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a40ec2b23684a0e6e6d7ac9783a269037"><td class="memItemLeft" align="right" valign="top">unsigned int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classKite_1_1SegmentFsm.html#a40ec2b23684a0e6e6d7ac9783a269037">getState</a> () const</td></tr>
<tr class="separator:a40ec2b23684a0e6e6d7ac9783a269037"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ad272e2f3fbbddcd6c8dc2f0187f08c4e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classKite_1_1DataNegociate.html">DataNegociate</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classKite_1_1SegmentFsm.html#ad272e2f3fbbddcd6c8dc2f0187f08c4e">getData</a> ()</td></tr>
<tr class="separator:ad272e2f3fbbddcd6c8dc2f0187f08c4e"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:abf6603c742bee65a4effa24135f2d955"><td class="memItemLeft" align="right" valign="top"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Interval.html">Interval</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classKite_1_1SegmentFsm.html#abf6603c742bee65a4effa24135f2d955">getConstraint</a> ()</td></tr>
<tr class="separator:abf6603c742bee65a4effa24135f2d955"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a9d1a7f4108b49d3096d8c733fabe60f3"><td class="memItemLeft" align="right" valign="top"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Interval.html">Interval</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classKite_1_1SegmentFsm.html#a9d1a7f4108b49d3096d8c733fabe60f3">getOptimal</a> ()</td></tr>
<tr class="separator:a9d1a7f4108b49d3096d8c733fabe60f3"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ab7144079976c8808e69f9aac68dda06d"><td class="memItemLeft" align="right" valign="top">vector&lt; TrackCost &gt; &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classKite_1_1SegmentFsm.html#ab7144079976c8808e69f9aac68dda06d">getCosts</a> ()</td></tr>
<tr class="separator:ab7144079976c8808e69f9aac68dda06d"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a5256595f77ebc80c3ee683cfdbc7f8f6"><td class="memItemLeft" align="right" valign="top">TrackCost &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classKite_1_1SegmentFsm.html#a5256595f77ebc80c3ee683cfdbc7f8f6">getCost</a> (size_t)</td></tr>
<tr class="separator:a5256595f77ebc80c3ee683cfdbc7f8f6"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:af2d9a3a5df8a4de5d263fb3fae563a8a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classKite_1_1Track.html">Track</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classKite_1_1SegmentFsm.html#af2d9a3a5df8a4de5d263fb3fae563a8a">getTrack</a> (size_t)</td></tr>
<tr class="separator:af2d9a3a5df8a4de5d263fb3fae563a8a"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a13a1ec8bdcf29f2bcb21cab348b77ed2"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classKite_1_1SegmentFsm.html#a13a1ec8bdcf29f2bcb21cab348b77ed2">getBegin</a> (size_t)</td></tr>
<tr class="separator:a13a1ec8bdcf29f2bcb21cab348b77ed2"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aaf31c0a3018908a2ee26a8ea9e893eb1"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classKite_1_1SegmentFsm.html#aaf31c0a3018908a2ee26a8ea9e893eb1">getEnd</a> (size_t)</td></tr>
<tr class="separator:aaf31c0a3018908a2ee26a8ea9e893eb1"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ab3b06bb353ee9333be6b937bffc8fd84"><td class="memItemLeft" align="right" valign="top">vector&lt; <a class="el" href="classKite_1_1SegmentAction.html">SegmentAction</a> &gt; &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classKite_1_1SegmentFsm.html#ab3b06bb353ee9333be6b937bffc8fd84">getActions</a> ()</td></tr>
<tr class="separator:ab3b06bb353ee9333be6b937bffc8fd84"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:adf5147448951f8dc8b4088a1032e97b2"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classKite_1_1SegmentFsm.html#adf5147448951f8dc8b4088a1032e97b2">setState</a> (unsigned int)</td></tr>
<tr class="separator:adf5147448951f8dc8b4088a1032e97b2"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ad9384c1cc2a9cd70ab9ff089b56380a0"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classKite_1_1SegmentFsm.html#ad9384c1cc2a9cd70ab9ff089b56380a0">addAction</a> (<a class="el" href="classKite_1_1TrackElement.html">TrackElement</a> *, unsigned int type, <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/group__DbUGroup.html#ga4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a> axisHint=0, unsigned int toState=0)</td></tr>
<tr class="separator:ad9384c1cc2a9cd70ab9ff089b56380a0"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:abbcf429498049478d4d8ab94cdb4a022"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classKite_1_1SegmentFsm.html#abbcf429498049478d4d8ab94cdb4a022">doActions</a> ()</td></tr>
<tr class="separator:abbcf429498049478d4d8ab94cdb4a022"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a4cf911f1f4e5ac588d502c9d069a1bde"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classKite_1_1SegmentFsm.html#a4cf911f1f4e5ac588d502c9d069a1bde">clearActions</a> ()</td></tr>
<tr class="separator:a4cf911f1f4e5ac588d502c9d069a1bde"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a7140b507da2cab137d968a037bed19df"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classKite_1_1SegmentFsm.html#a7140b507da2cab137d968a037bed19df">insertInTrack</a> (size_t)</td></tr>
<tr class="separator:a7140b507da2cab137d968a037bed19df"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a0d9a9926ae67cc7998799347f135e28a"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classKite_1_1SegmentFsm.html#a0d9a9926ae67cc7998799347f135e28a">conflictSolveByHistory</a> ()</td></tr>
<tr class="separator:a0d9a9926ae67cc7998799347f135e28a"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a9c0fa6a9067b6e027e24f38330f627dc"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classKite_1_1SegmentFsm.html#a9c0fa6a9067b6e027e24f38330f627dc">conflictSolveByPlaceds</a> ()</td></tr>
<tr class="separator:a9c0fa6a9067b6e027e24f38330f627dc"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a0b8e8be9d7c9501be9534d3c2a9dd586"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classKite_1_1SegmentFsm.html#a0b8e8be9d7c9501be9534d3c2a9dd586">desaturate</a> ()</td></tr>
<tr class="separator:a0b8e8be9d7c9501be9534d3c2a9dd586"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a623d68f599c0de60cdd36af3f183e6f1"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classKite_1_1SegmentFsm.html#a623d68f599c0de60cdd36af3f183e6f1">slackenTopology</a> (unsigned int flags=0)</td></tr>
<tr class="separator:a623d68f599c0de60cdd36af3f183e6f1"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ab8ae818baad1d0a274a7e8c308ca3f92"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classKite_1_1SegmentFsm.html#ab8ae818baad1d0a274a7e8c308ca3f92">solveFullBlockages</a> ()</td></tr>
<tr class="separator:ab8ae818baad1d0a274a7e8c308ca3f92"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p>Pseudo-decorator to process a <a class="el" href="classKite_1_1RoutingEvent.html" title="Atomic Placement Request for a TrackSegment. ">RoutingEvent</a>. </p>
<p>The <a class="el" href="classKite_1_1SegmentFsm.html" title="Pseudo-decorator to process a RoutingEvent. ">SegmentFsm</a> class actually perform the placement of the <a class="el" href="classKite_1_1TrackElement.html" title="Abstract Class for all Elements inserted inside a Track. ">Kite::TrackElement</a> of the <a class="el" href="classKite_1_1RoutingEvent.html" title="Atomic Placement Request for a TrackSegment. ">Kite::RoutingEvent</a>. It structured around three goals:</p><ul>
<li>Implement the finite state machine for the <a class="el" href="classKite_1_1DataNegociate.html" title="Algorimthmic datas associated the TrackSegment. ">Kite::DataNegociate</a> state.</li>
<li>Provide a kind of decoration on the RoutingEvent/TrackElement (it do not abide by the definition from Design Patterns).</li>
<li>Cache a lot of on-the-fly computed datas needed during the <a class="el" href="classKite_1_1SegmentFsm.html" title="Pseudo-decorator to process a RoutingEvent. ">SegmentFsm</a> lifetime and the Manipulator(s) it may uses.</li>
</ul>
<h1><a class="anchor" id="secUpdate"></a>
Update Mechanism</h1>
<p>The constructor of <a class="el" href="classKite_1_1SegmentFsm.html" title="Pseudo-decorator to process a RoutingEvent. ">SegmentFsm</a> triggers the update of the <a class="el" href="classKite_1_1RoutingEvent.html" title="Atomic Placement Request for a TrackSegment. ">RoutingEvent</a> and through it <a class="el" href="classKite_1_1DataNegociate.html" title="Algorimthmic datas associated the TrackSegment. ">DataNegociate</a>.</p>
<h1><a class="anchor" id="secSlackening"></a>
Slackening / FSM Transitions</h1>
<p>A transition occurs in the FSM whenener all the availables ripup methods for a segment have failed. Failure means that the topology of the net itself must be altered to allow a greater level of flexibility. Modifying the net topology means to give the current segment some more slack.</p>
<p>Availables slackening operations:</p><ol type="1">
<li><a class="el" href="classKite_1_1DataNegociate.html#ab7ccb6fc1f298728995250a3bbcf18c7a19d8d157762b2b73c5274e4865523d29">DataNegociate::RipupPerpandiculars</a> (<a class="el" href="classKite_1_1Manipulator.html" title="Handle TrackElement ripup &amp; topological modifications. ">Manipulator</a>) place the segments before any of it's perpandiculars are placed to allow a maximum track choice.</li>
<li><a class="el" href="classKite_1_1DataNegociate.html#ab7ccb6fc1f298728995250a3bbcf18c7a548e204a4e2ffae50774910737f11380">DataNegociate::Minimize</a> (<a class="el" href="classKite_1_1Manipulator.html" title="Handle TrackElement ripup &amp; topological modifications. ">Manipulator</a>) try to fit the segment in a hole in a track, perform a hole detection.</li>
<li><a class="el" href="classKite_1_1DataNegociate.html#ab7ccb6fc1f298728995250a3bbcf18c7a361bca46d5e7bdf02f50f7ecaa6018a9">DataNegociate::Dogleg</a> (<a class="el" href="classKite_1_1Manipulator.html" title="Handle TrackElement ripup &amp; topological modifications. ">Manipulator</a>) create a dogleg matching <em>the first track candidate</em> with a non-nul overlap.</li>
<li><a class="el" href="classKite_1_1DataNegociate.html#ab7ccb6fc1f298728995250a3bbcf18c7a0d4bff02b3163821c0e5f7ad9dd55f36">DataNegociate::Slacken</a> (<a class="el" href="classKite_1_1Manipulator.html" title="Handle TrackElement ripup &amp; topological modifications. ">Manipulator</a>) <span class="red">to be reviewed.</span></li>
<li><a class="el" href="classKite_1_1DataNegociate.html#ab7ccb6fc1f298728995250a3bbcf18c7ae08187cba35efd6229ab8acfd003a600">DataNegociate::ConflictSolveByHistory</a> (<a class="el" href="classKite_1_1SegmentFsm.html" title="Pseudo-decorator to process a RoutingEvent. ">SegmentFsm</a>) try to find a break point on the segment, based on the ripup history.</li>
<li><a class="el" href="classKite_1_1DataNegociate.html#ab7ccb6fc1f298728995250a3bbcf18c7afce071be0ba39626ed1c865789da598b">DataNegociate::ConflictSolveByPlaceds</a> (<a class="el" href="classKite_1_1SegmentFsm.html" title="Pseudo-decorator to process a RoutingEvent. ">SegmentFsm</a>) try to find a break point on the segment, based on the current position of segments on the candidate tracks.</li>
<li><a class="el" href="classKite_1_1DataNegociate.html#ab7ccb6fc1f298728995250a3bbcf18c7adfd76a7d65b56ed7ecc0eedf921d6f82">DataNegociate::MoveUp</a> (<a class="el" href="classKite_1_1Manipulator.html" title="Handle TrackElement ripup &amp; topological modifications. ">Manipulator</a>) try to move up the segment.</li>
</ol>
<p>Simple slackening operations are defined in <a class="el" href="classKite_1_1Manipulator.html" title="Handle TrackElement ripup &amp; topological modifications. ">Manipulator</a> and complex ones directly in <a class="el" href="classKite_1_1SegmentFsm.html" title="Pseudo-decorator to process a RoutingEvent. ">SegmentFsm</a>.</p>
<h1><a class="anchor" id="secNonSlackening"></a>
Non-Slackening Operations</h1>
<p>In addition, some operation that do not modifies the topology are availables:</p><ol type="1">
<li><a class="el" href="classKite_1_1Manipulator.html#add26b688d75a99a1ae781787eead08d5">Manipulator::forceOverLocals()</a> mostly for global segments to ripup a track from all it's locals.</li>
<li><a class="el" href="classKite_1_1SegmentFsm.html#a7140b507da2cab137d968a037bed19df">SegmentFsm::insertInTrack()</a> automates the three subsequent ripup trials. </li>
</ol>
</div><h2 class="groupheader">Member Enumeration Documentation</h2>
<a id="a5d74787dedbc4e11c1ab15bf487e61f8"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a5d74787dedbc4e11c1ab15bf487e61f8">&#9670;&nbsp;</a></span>State</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">enum <a class="el" href="classKite_1_1SegmentFsm.html#a5d74787dedbc4e11c1ab15bf487e61f8">State</a></td>
</tr>
</table>
</div><div class="memdoc">
<p>Indicates what the <a class="el" href="classKite_1_1SegmentFsm.html" title="Pseudo-decorator to process a RoutingEvent. ">SegmentFsm</a> has done the processed <a class="el" href="classKite_1_1TrackElement.html" title="Abstract Class for all Elements inserted inside a Track. ">TrackElement</a>, possible values are:</p><ul>
<li><a class="el" href="classKite_1_1SegmentFsm.html#a5d74787dedbc4e11c1ab15bf487e61f8a79ae4f26b8ed9c55b81f981bb5076e1d">SegmentFsm::MissingData</a>, this is an error condition, the <a class="el" href="classKite_1_1TrackElement.html" title="Abstract Class for all Elements inserted inside a Track. ">TrackElement</a> do not have associated <a class="el" href="classKite_1_1DataNegociate.html" title="Algorimthmic datas associated the TrackSegment. ">DataNegociate</a> structure. Nothing is done.</li>
<li><a class="el" href="classKite_1_1SegmentFsm.html#a5d74787dedbc4e11c1ab15bf487e61f8a13ac7e0722ca806ff25d8fa9220e980b">SegmentFsm::EmptyTrackList</a>, no <a class="el" href="classKite_1_1Track.html" title="Structure managing one routing track. ">Track</a> is available for placement (free or used).</li>
<li><a class="el" href="classKite_1_1SegmentFsm.html#a5d74787dedbc4e11c1ab15bf487e61f8a8c564779c81599aaadbe879fa2b08d92">SegmentFsm::SelfInserted</a>, the <a class="el" href="classKite_1_1TrackElement.html" title="Abstract Class for all Elements inserted inside a Track. ">TrackElement</a> can be successfully inserted in a <a class="el" href="classKite_1_1Track.html" title="Structure managing one routing track. ">Track</a> (i.e. without overlap).</li>
<li><a class="el" href="classKite_1_1SegmentFsm.html#a5d74787dedbc4e11c1ab15bf487e61f8a560766bb79539564fdeda432c8efae6d">SegmentFsm::SelfMaximumSlack</a>, nothing can be done to further slacken the <a class="el" href="classKite_1_1TrackElement.html" title="Abstract Class for all Elements inserted inside a Track. ">TrackElement</a>, it is at maximum ripup of the last possible state (no more topological modifications are possibles).</li>
<li><a class="el" href="classKite_1_1SegmentFsm.html#a5d74787dedbc4e11c1ab15bf487e61f8a22374bab829fac7d12af4784d80eeb6e">SegmentFsm::OtherRipup</a>, the <a class="el" href="classKite_1_1TrackElement.html" title="Abstract Class for all Elements inserted inside a Track. ">TrackElement</a> can be inserted but it needs the ripup of some others. </li>
</ul>
<table class="fieldtable">
<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="a5d74787dedbc4e11c1ab15bf487e61f8a79ae4f26b8ed9c55b81f981bb5076e1d"></a>MissingData&#160;</td><td class="fielddoc"><p><b>[Flag]</b>, see SegmentFsm::SegmentFsmValue. </p>
</td></tr>
<tr><td class="fieldname"><a id="a5d74787dedbc4e11c1ab15bf487e61f8a13ac7e0722ca806ff25d8fa9220e980b"></a>EmptyTrackList&#160;</td><td class="fielddoc"><p><b>[Flag]</b>, see SegmentFsm::SegmentFsmValue. </p>
</td></tr>
<tr><td class="fieldname"><a id="a5d74787dedbc4e11c1ab15bf487e61f8abb9adb1672565a2d0c2de07ea840414e"></a>Inserted&#160;</td><td class="fielddoc"><p><b>[Flag]</b>, the <a class="el" href="classKite_1_1TrackElement.html" title="Abstract Class for all Elements inserted inside a Track. ">TrackElement</a> can be inserted in a <a class="el" href="classKite_1_1Track.html" title="Structure managing one routing track. ">Track</a>. </p>
</td></tr>
<tr><td class="fieldname"><a id="a5d74787dedbc4e11c1ab15bf487e61f8aacd3ef9d889b306ca7e7bdcd37ba659a"></a>Self&#160;</td><td class="fielddoc"><p><b>[Flag]</b>, the action is related to the processed <a class="el" href="classKite_1_1TrackSegment.html" title="Derived Katabatic::AutoSegment for the router. ">TrackSegment</a>. </p>
</td></tr>
<tr><td class="fieldname"><a id="a5d74787dedbc4e11c1ab15bf487e61f8a75f0c3176be2226dfe8ad164a0a034a2"></a>Other&#160;</td><td class="fielddoc"><p><b>[Flag]</b>, the action is <b>not</b> related to the processed <a class="el" href="classKite_1_1TrackSegment.html" title="Derived Katabatic::AutoSegment for the router. ">TrackSegment</a>, that is, others are being topologically modificated or riped up. </p>
</td></tr>
<tr><td class="fieldname"><a id="a5d74787dedbc4e11c1ab15bf487e61f8a08900dc237aef7e4a7f50d2ba1ffd748"></a>Ripup&#160;</td><td class="fielddoc"><p><b>[Flag]</b>, segement, that are not the processed one are being ripped up. </p>
</td></tr>
<tr><td class="fieldname"><a id="a5d74787dedbc4e11c1ab15bf487e61f8a9fc7197613f3435d906edf69a73acf38"></a>MaximumSlack&#160;</td><td class="fielddoc"><p><b>[Flag]</b>, the processed segment as reached it's maximum ripup count on the last possible slackening state. </p>
</td></tr>
<tr><td class="fieldname"><a id="a5d74787dedbc4e11c1ab15bf487e61f8a8c564779c81599aaadbe879fa2b08d92"></a>SelfInserted&#160;</td><td class="fielddoc"><p><b>[Mask]</b>, see SegmentFsm::SegmentFsmValue. </p>
</td></tr>
<tr><td class="fieldname"><a id="a5d74787dedbc4e11c1ab15bf487e61f8a22374bab829fac7d12af4784d80eeb6e"></a>OtherRipup&#160;</td><td class="fielddoc"><p><b>[Mask]</b>, see SegmentFsm::SegmentFsmValue. </p>
</td></tr>
<tr><td class="fieldname"><a id="a5d74787dedbc4e11c1ab15bf487e61f8a560766bb79539564fdeda432c8efae6d"></a>SelfMaximumSlack&#160;</td><td class="fielddoc"><p><b>[Mask]</b>, see SegmentFsm::SegmentFsmValue. </p>
</td></tr>
</table>
</div>
</div>
<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
<a id="a2a8eadaaf3ed213914e7b4a81cae6e6a"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a2a8eadaaf3ed213914e7b4a81cae6e6a">&#9670;&nbsp;</a></span>SegmentFsm()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="classKite_1_1SegmentFsm.html">SegmentFsm</a> </td>
<td>(</td>
<td class="paramtype"><a class="el" href="classKite_1_1RoutingEvent.html">RoutingEvent</a> *&#160;</td>
<td class="paramname"><em>event</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="classKite_1_1RoutingEventQueue.html">RoutingEventQueue</a> &amp;&#160;</td>
<td class="paramname"><em>queue</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="classKite_1_1RoutingEventHistory.html">RoutingEventHistory</a> &amp;&#160;</td>
<td class="paramname"><em>history</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">event</td><td>The <a class="el" href="classKite_1_1RoutingEvent.html" title="Atomic Placement Request for a TrackSegment. ">RoutingEvent</a> to be processed. </td></tr>
<tr><td class="paramname">queue</td><td>The <a class="el" href="classKite_1_1RoutingEvent.html" title="Atomic Placement Request for a TrackSegment. ">RoutingEvent</a> queue. </td></tr>
<tr><td class="paramname">history</td><td>The complete history of <a class="el" href="classKite_1_1RoutingEvent.html" title="Atomic Placement Request for a TrackSegment. ">RoutingEvent</a>.</td></tr>
</table>
</dd>
</dl>
<p>Construct a <a class="el" href="classKite_1_1SegmentFsm.html" title="Pseudo-decorator to process a RoutingEvent. ">SegmentFsm</a> from a <a class="el" href="classKite_1_1RoutingEvent.html" title="Atomic Placement Request for a TrackSegment. ">RoutingEvent</a>. The constructor is in charge of computing all the cached values. </p>
</div>
</div>
<h2 class="groupheader">Member Function Documentation</h2>
<a id="a90fb28e997bec986238b81c0316319f0"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a90fb28e997bec986238b81c0316319f0">&#9670;&nbsp;</a></span>isFullBlocked()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">bool isFullBlocked </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td> const</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p><b>Returns:</b> <b>true</b> if there are Tracks avalaibles but the constraints are such that none is actually usable. </p>
</div>
</div>
<a id="a513f39c546ef4be0d13787cdace4eadf"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a513f39c546ef4be0d13787cdace4eadf">&#9670;&nbsp;</a></span>getEvent()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="classKite_1_1RoutingEvent.html">RoutingEvent</a> * getEvent </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td> const</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p><b>Returns:</b> The currently processed <a class="el" href="classKite_1_1RoutingEvent.html" title="Atomic Placement Request for a TrackSegment. ">RoutingEvent</a> (<em>cached</em>). </p>
<p class="reference">Referenced by <a class="el" href="classKite_1_1SegmentFsm.html#abbcf429498049478d4d8ab94cdb4a022">SegmentFsm::doActions()</a>, <a class="el" href="classKite_1_1SegmentFsm.html#a623d68f599c0de60cdd36af3f183e6f1">SegmentFsm::slackenTopology()</a>, and <a class="el" href="classKite_1_1SegmentFsm.html#ab8ae818baad1d0a274a7e8c308ca3f92">SegmentFsm::solveFullBlockages()</a>.</p>
</div>
</div>
<a id="a3e86badede6ba842280779cecea21e81"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a3e86badede6ba842280779cecea21e81">&#9670;&nbsp;</a></span>getQueue()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="classKite_1_1RoutingEventQueue.html">RoutingEventQueue</a> &amp; getQueue </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td> const</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p><b>Returns:</b> The <a class="el" href="classKite_1_1RoutingEvent.html" title="Atomic Placement Request for a TrackSegment. ">RoutingEvent</a> queue (<em>cached</em>). </p>
</div>
</div>
<a id="a1bf115c7f375168ec89ec400d58440b4"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a1bf115c7f375168ec89ec400d58440b4">&#9670;&nbsp;</a></span>getHistory()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="classKite_1_1RoutingEventHistory.html">RoutingEventHistory</a> &amp; getHistory </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td> const</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p><b>Returns:</b> The <a class="el" href="classKite_1_1RoutingEvent.html" title="Atomic Placement Request for a TrackSegment. ">RoutingEvent</a> history (<em>cached</em>). </p>
<p class="reference">Referenced by <a class="el" href="classKite_1_1SegmentFsm.html#a0d9a9926ae67cc7998799347f135e28a">SegmentFsm::conflictSolveByHistory()</a>.</p>
</div>
</div>
<a id="a40ec2b23684a0e6e6d7ac9783a269037"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a40ec2b23684a0e6e6d7ac9783a269037">&#9670;&nbsp;</a></span>getState()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">unsigned int getState </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td> const</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p><b>Returns:</b> The state (SegmentFsm::SegmentFsmValues) which the <a class="el" href="classKite_1_1SegmentFsm.html" title="Pseudo-decorator to process a RoutingEvent. ">SegmentFsm</a> has computed for the <a class="el" href="classKite_1_1RoutingEvent.html" title="Atomic Placement Request for a TrackSegment. ">RoutingEvent</a>. This is <b>not</b> the state of the <a class="el" href="classKite_1_1DataNegociate.html" title="Algorimthmic datas associated the TrackSegment. ">DataNegociate</a> </p>
</div>
</div>
<a id="ad272e2f3fbbddcd6c8dc2f0187f08c4e"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad272e2f3fbbddcd6c8dc2f0187f08c4e">&#9670;&nbsp;</a></span>getData()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="classKite_1_1DataNegociate.html">DataNegociate</a> * getData </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p><b>Returns:</b> The <a class="el" href="classKite_1_1DataNegociate.html" title="Algorimthmic datas associated the TrackSegment. ">DataNegociate</a> of the <a class="el" href="classKite_1_1TrackElement.html" title="Abstract Class for all Elements inserted inside a Track. ">TrackElement</a> (<em>cached</em>). </p>
</div>
</div>
<a id="abf6603c742bee65a4effa24135f2d955"></a>
<h2 class="memtitle"><span class="permalink"><a href="#abf6603c742bee65a4effa24135f2d955">&#9670;&nbsp;</a></span>getConstraint()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Interval.html">Interval</a> &amp; getConstraint </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p><b>Returns:</b> The interval into which the segment axis can be set (computed from the topological constraints and the placement constraints on the already placed perpandiculars). </p>
</div>
</div>
<a id="a9d1a7f4108b49d3096d8c733fabe60f3"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a9d1a7f4108b49d3096d8c733fabe60f3">&#9670;&nbsp;</a></span>getOptimal()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Interval.html">Interval</a> &amp; getOptimal </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p><b>Returns:</b> The interval for an optimal placement of the segment axis. </p>
</div>
</div>
<a id="ab7144079976c8808e69f9aac68dda06d"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ab7144079976c8808e69f9aac68dda06d">&#9670;&nbsp;</a></span>getCosts()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">vector&lt; TrackCost &gt; &amp; getCosts </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p><b>Returns:</b> The table of cost for all the candidates Tracks of the segment. The table is sorted in increasing cost order (see TrackCost). </p>
<p class="reference">Referenced by <a class="el" href="classKite_1_1SegmentFsm.html#a0b8e8be9d7c9501be9534d3c2a9dd586">SegmentFsm::desaturate()</a>, <a class="el" href="classKite_1_1Manipulator.html#add26b688d75a99a1ae781787eead08d5">Manipulator::forceOverLocals()</a>, <a class="el" href="classKite_1_1Manipulator.html#af4d93a43ea18ae124da71072c66d1e0a">Manipulator::makeDogleg()</a>, and <a class="el" href="classKite_1_1Manipulator.html#aa61f08642d981761687635be108b9837">Manipulator::minimize()</a>.</p>
</div>
</div>
<a id="a5256595f77ebc80c3ee683cfdbc7f8f6"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a5256595f77ebc80c3ee683cfdbc7f8f6">&#9670;&nbsp;</a></span>getCost()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">TrackCost &amp; getCost </td>
<td>(</td>
<td class="paramtype">size_t&#160;</td>
<td class="paramname"><em>i</em></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p><b>Returns:</b> The cost at index <code>i</code> in the table. </p>
<p class="reference">Referenced by <a class="el" href="classKite_1_1SegmentFsm.html#a0b8e8be9d7c9501be9534d3c2a9dd586">SegmentFsm::desaturate()</a>, <a class="el" href="classKite_1_1Manipulator.html#add26b688d75a99a1ae781787eead08d5">Manipulator::forceOverLocals()</a>, <a class="el" href="classKite_1_1Manipulator.html#a76d3956660cfa624696e2a5f2916cd22">Manipulator::forceToTrack()</a>, <a class="el" href="classKite_1_1Manipulator.html#a7140b507da2cab137d968a037bed19df">Manipulator::insertInTrack()</a>, <a class="el" href="classKite_1_1Manipulator.html#aa61f08642d981761687635be108b9837">Manipulator::minimize()</a>, and <a class="el" href="classKite_1_1SegmentFsm.html#ab8ae818baad1d0a274a7e8c308ca3f92">SegmentFsm::solveFullBlockages()</a>.</p>
</div>
</div>
<a id="af2d9a3a5df8a4de5d263fb3fae563a8a"></a>
<h2 class="memtitle"><span class="permalink"><a href="#af2d9a3a5df8a4de5d263fb3fae563a8a">&#9670;&nbsp;</a></span>getTrack()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="classKite_1_1Track.html">Track</a> * getTrack </td>
<td>(</td>
<td class="paramtype">size_t&#160;</td>
<td class="paramname"><em>i</em></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p><b>Returns:</b> The <a class="el" href="classKite_1_1Track.html" title="Structure managing one routing track. ">Track</a> for cost at index <code>i</code> in the table. </p>
<p class="reference">Referenced by <a class="el" href="classKite_1_1SegmentFsm.html#a0b8e8be9d7c9501be9534d3c2a9dd586">SegmentFsm::desaturate()</a>, <a class="el" href="classKite_1_1Manipulator.html#add26b688d75a99a1ae781787eead08d5">Manipulator::forceOverLocals()</a>, <a class="el" href="classKite_1_1Manipulator.html#a76d3956660cfa624696e2a5f2916cd22">Manipulator::forceToTrack()</a>, <a class="el" href="classKite_1_1Manipulator.html#a7140b507da2cab137d968a037bed19df">Manipulator::insertInTrack()</a>, <a class="el" href="classKite_1_1Manipulator.html#af4d93a43ea18ae124da71072c66d1e0a">Manipulator::makeDogleg()</a>, <a class="el" href="classKite_1_1Manipulator.html#aa61f08642d981761687635be108b9837">Manipulator::minimize()</a>, and <a class="el" href="classKite_1_1Manipulator.html#aba69c61ccb330e26aaa8211f0454795f">Manipulator::shrinkToTrack()</a>.</p>
</div>
</div>
<a id="a13a1ec8bdcf29f2bcb21cab348b77ed2"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a13a1ec8bdcf29f2bcb21cab348b77ed2">&#9670;&nbsp;</a></span>getBegin()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">size_t getBegin </td>
<td>(</td>
<td class="paramtype">size_t&#160;</td>
<td class="paramname"><em>i</em></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p><b>Returns:</b> The overlapping <em>begin</em> index in <a class="el" href="classKite_1_1Track.html" title="Structure managing one routing track. ">Track</a> for cost at index <code>i</code> in the table. </p>
<p class="reference">Referenced by <a class="el" href="classKite_1_1SegmentFsm.html#a0b8e8be9d7c9501be9534d3c2a9dd586">SegmentFsm::desaturate()</a>, <a class="el" href="classKite_1_1Manipulator.html#add26b688d75a99a1ae781787eead08d5">Manipulator::forceOverLocals()</a>, <a class="el" href="classKite_1_1Manipulator.html#a76d3956660cfa624696e2a5f2916cd22">Manipulator::forceToTrack()</a>, <a class="el" href="classKite_1_1Manipulator.html#a7140b507da2cab137d968a037bed19df">Manipulator::insertInTrack()</a>, <a class="el" href="classKite_1_1Manipulator.html#af4d93a43ea18ae124da71072c66d1e0a">Manipulator::makeDogleg()</a>, <a class="el" href="classKite_1_1Manipulator.html#aa61f08642d981761687635be108b9837">Manipulator::minimize()</a>, and <a class="el" href="classKite_1_1Manipulator.html#aba69c61ccb330e26aaa8211f0454795f">Manipulator::shrinkToTrack()</a>.</p>
</div>
</div>
<a id="aaf31c0a3018908a2ee26a8ea9e893eb1"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aaf31c0a3018908a2ee26a8ea9e893eb1">&#9670;&nbsp;</a></span>getEnd()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">size_t getEnd </td>
<td>(</td>
<td class="paramtype">size_t&#160;</td>
<td class="paramname"><em>i</em></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p><b>Returns:</b> The overlapping <em>end</em> index in <a class="el" href="classKite_1_1Track.html" title="Structure managing one routing track. ">Track</a> for cost at index <code>i</code> in the table. </p>
<p class="reference">Referenced by <a class="el" href="classKite_1_1SegmentFsm.html#a0b8e8be9d7c9501be9534d3c2a9dd586">SegmentFsm::desaturate()</a>, <a class="el" href="classKite_1_1Manipulator.html#add26b688d75a99a1ae781787eead08d5">Manipulator::forceOverLocals()</a>, <a class="el" href="classKite_1_1Manipulator.html#a76d3956660cfa624696e2a5f2916cd22">Manipulator::forceToTrack()</a>, <a class="el" href="classKite_1_1Manipulator.html#a7140b507da2cab137d968a037bed19df">Manipulator::insertInTrack()</a>, <a class="el" href="classKite_1_1Manipulator.html#af4d93a43ea18ae124da71072c66d1e0a">Manipulator::makeDogleg()</a>, <a class="el" href="classKite_1_1Manipulator.html#aa61f08642d981761687635be108b9837">Manipulator::minimize()</a>, and <a class="el" href="classKite_1_1Manipulator.html#aba69c61ccb330e26aaa8211f0454795f">Manipulator::shrinkToTrack()</a>.</p>
</div>
</div>
<a id="ab3b06bb353ee9333be6b937bffc8fd84"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ab3b06bb353ee9333be6b937bffc8fd84">&#9670;&nbsp;</a></span>getActions()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">vector&lt; <a class="el" href="classKite_1_1SegmentAction.html">SegmentAction</a> * &gt; &amp; getActions </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p><b>Returns:</b> The table of <a class="el" href="classKite_1_1SegmentAction.html" title="Store request for an event to be generated on a TrackElement. ">SegmentAction</a>, that is the delayed requests for <a class="el" href="classKite_1_1RoutingEvent.html" title="Atomic Placement Request for a TrackSegment. ">RoutingEvent</a> creation. </p>
<p class="reference">Referenced by <a class="el" href="classKite_1_1Manipulator.html#aba69c61ccb330e26aaa8211f0454795f">Manipulator::shrinkToTrack()</a>.</p>
</div>
</div>
<a id="adf5147448951f8dc8b4088a1032e97b2"></a>
<h2 class="memtitle"><span class="permalink"><a href="#adf5147448951f8dc8b4088a1032e97b2">&#9670;&nbsp;</a></span>setState()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">unsigned int setState </td>
<td>(</td>
<td class="paramtype">unsigned int&#160;</td>
<td class="paramname"><em>state</em></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p><b>Returns:</b> Sets the state of the state... </p>
<p class="reference">Referenced by <a class="el" href="classKite_1_1SegmentFsm.html#a0b8e8be9d7c9501be9534d3c2a9dd586">SegmentFsm::desaturate()</a>, <a class="el" href="classKite_1_1Manipulator.html#add26b688d75a99a1ae781787eead08d5">Manipulator::forceOverLocals()</a>, <a class="el" href="classKite_1_1Manipulator.html#a76d3956660cfa624696e2a5f2916cd22">Manipulator::forceToTrack()</a>, <a class="el" href="classKite_1_1Manipulator.html#a7140b507da2cab137d968a037bed19df">Manipulator::insertInTrack()</a>, and <a class="el" href="classKite_1_1Manipulator.html#aba69c61ccb330e26aaa8211f0454795f">Manipulator::shrinkToTrack()</a>.</p>
</div>
</div>
<a id="ad9384c1cc2a9cd70ab9ff089b56380a0"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad9384c1cc2a9cd70ab9ff089b56380a0">&#9670;&nbsp;</a></span>addAction()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void addAction </td>
<td>(</td>
<td class="paramtype"><a class="el" href="classKite_1_1TrackElement.html">TrackElement</a> *&#160;</td>
<td class="paramname"><em>segment</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned int&#160;</td>
<td class="paramname"><em>type</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/group__DbUGroup.html#ga4fbfa3e8c89347af76c9628ea06c4146">DbU::Unit</a>&#160;</td>
<td class="paramname"><em>axisHint</em> = <code>0</code>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned int&#160;</td>
<td class="paramname"><em>toState</em> = <code>0</code>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Request the creation of a new delayed <a class="el" href="classKite_1_1RoutingEvent.html" title="Atomic Placement Request for a TrackSegment. ">RoutingEvent</a>, for the meaning of the parameters, see <a class="el" href="classKite_1_1SegmentAction.html#acbeca58f8327b69a540628f299d5bd35">SegmentAction::SegmentAction</a>. </p>
<p class="reference">Referenced by <a class="el" href="classKite_1_1SegmentFsm.html#a0b8e8be9d7c9501be9534d3c2a9dd586">SegmentFsm::desaturate()</a>, <a class="el" href="classKite_1_1Manipulator.html#add26b688d75a99a1ae781787eead08d5">Manipulator::forceOverLocals()</a>, <a class="el" href="classKite_1_1Manipulator.html#a76d3956660cfa624696e2a5f2916cd22">Manipulator::forceToTrack()</a>, <a class="el" href="classKite_1_1Manipulator.html#a7140b507da2cab137d968a037bed19df">Manipulator::insertInTrack()</a>, <a class="el" href="classKite_1_1Manipulator.html#aa61f08642d981761687635be108b9837">Manipulator::minimize()</a>, <a class="el" href="classKite_1_1Manipulator.html#a8b5b69fd5762d5a0cbc4ceea4d1b68c1">Manipulator::relax()</a>, <a class="el" href="classKite_1_1Manipulator.html#a9721ea909a9b11297dea855e1ba82a55">Manipulator::repackPerpandiculars()</a>, <a class="el" href="classKite_1_1Manipulator.html#af46102d49a7aa0c163de1bf143807794">Manipulator::ripple()</a>, <a class="el" href="classKite_1_1Manipulator.html#a370b5a5373d3019510d4ec22f44c76c2">Manipulator::ripup()</a>, <a class="el" href="classKite_1_1Manipulator.html#a147c24aa53f561c10d5d24b82b03448a">Manipulator::ripupPerpandiculars()</a>, <a class="el" href="classKite_1_1Manipulator.html#aba69c61ccb330e26aaa8211f0454795f">Manipulator::shrinkToTrack()</a>, and <a class="el" href="classKite_1_1SegmentFsm.html#a623d68f599c0de60cdd36af3f183e6f1">SegmentFsm::slackenTopology()</a>.</p>
</div>
</div>
<a id="abbcf429498049478d4d8ab94cdb4a022"></a>
<h2 class="memtitle"><span class="permalink"><a href="#abbcf429498049478d4d8ab94cdb4a022">&#9670;&nbsp;</a></span>doActions()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">bool doActions </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Actually generate RoutingEvent(s) from the SegmentAction(s). </p>
</div>
</div>
<a id="a4cf911f1f4e5ac588d502c9d069a1bde"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a4cf911f1f4e5ac588d502c9d069a1bde">&#9670;&nbsp;</a></span>clearActions()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">void clearActions </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Clear the the table of requested actions, whithout generating them. </p>
<p class="reference">Referenced by <a class="el" href="classKite_1_1Manipulator.html#a7140b507da2cab137d968a037bed19df">Manipulator::insertInTrack()</a>, and <a class="el" href="classKite_1_1SegmentFsm.html#a623d68f599c0de60cdd36af3f183e6f1">SegmentFsm::slackenTopology()</a>.</p>
</div>
</div>
<a id="a7140b507da2cab137d968a037bed19df"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a7140b507da2cab137d968a037bed19df">&#9670;&nbsp;</a></span>insertInTrack()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">bool insertInTrack </td>
<td>(</td>
<td class="paramtype">size_t&#160;</td>
<td class="paramname"><em>i</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Try to insert the <a class="el" href="classKite_1_1TrackElement.html" title="Abstract Class for all Elements inserted inside a Track. ">TrackElement</a> in the <a class="el" href="classKite_1_1Track.html" title="Structure managing one routing track. ">Track</a> at index <code>i</code> (in the cost table). Return <b>true</b> if the insertion is possible.</p>
<p>The insertion is not done at this stage, but a set of ripup actions is emitted to allow insertion the next time the segment will be processed.</p>
<p>Three subsequent trials are done before giving up on inserting the segment:</p><ol type="1">
<li><a class="el" href="classKite_1_1Manipulator.html#a7140b507da2cab137d968a037bed19df">Manipulator::insertInTrack()</a>, try to push asides the neighbors.</li>
<li><a class="el" href="classKite_1_1Manipulator.html#aba69c61ccb330e26aaa8211f0454795f">Manipulator::shrinkToTrack()</a>, try squeeze the segment in an existing free space.</li>
<li><a class="el" href="classKite_1_1Manipulator.html#a76d3956660cfa624696e2a5f2916cd22">Manipulator::forceToTrack()</a>, perform a complete ripup of all the neighbors and their perpandiculars.</li>
</ol>
<p>The event keeps track of the insertion attempt step (see <a class="el" href="classKite_1_1RoutingEvent.html#a00f02910915e7deb857f023e5d584c08">RoutingEvent::getInsertState()</a>). </p>
</div>
</div>
<a id="a0d9a9926ae67cc7998799347f135e28a"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a0d9a9926ae67cc7998799347f135e28a">&#9670;&nbsp;</a></span>conflictSolveByHistory()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">bool conflictSolveByHistory </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p><b>Returns:</b> <b>true</b> if a suitable dogleg has been created in the segment.</p>
<p>Initially, global segments may be very long, and a placement solution in which each one is placed on a track of it's own may not be realisable. In that case, at least one of the global segment must be broken. The figure below illustrate the case: <b>(a)</b>, <b>(b)</b>, <b>(c)</b> form a first cluster and <b>(d)</b>, <b>(e)</b>, <b>(f)</b> form a second one. Due to the constraints of the segments the remaining free track cannot be the same in both clusters. The only solution to place <b>(g)</b> is to break it into two sub-globals. The whole point of the conflict solve is to correctly detect the cluster and choose the breaking point.</p>
<div class="image">
<img src="ConflictSolve-1.png" alt="ConflictSolve-1.png"/>
<div class="caption">
Conflict Between Globals</div></div>
<p> This variant of the conflict solve method try to guess the track span for which there is a conflict by looking at the event history.</p>
<div class="image">
<img src="ConflictSolveByHistory-1.png" alt="ConflictSolveByHistory-1.png"/>
<div class="caption">
Building Conflicting Intervals</div></div>
<p> <b>Dislodger Definition:</b></p>
<p>A segment is said to be a dislodger if it matches the two following criterions:</p><ul>
<li>It's span intersect the to be inserted segment span.</li>
<li>It has been placed on a track inside the perpandicular span of the to be placed segment.</li>
</ul>
<p>For the time beeing we limit the search to the last three dislodgers, to not waste too much time looking back the event history. We merge overlapping intervals into one (see the undocumented class <code>UnionIntervals</code> and <code>RipupHistory</code> in <code>SegmentFsm.cpp</code>).</p>
<p><span class="red">For the time beeing we only look on the track into which</span> <span class="red">the to be inserted segment wants to be placed.</span></p>
<p>Then we try to break the to be placed segment, first under the lower bound (source) of the conflicting interval then, in case of failure under the upper bound (target).</p>
<div class="image">
<img src="ConflictSolveByHistory-2.png" alt="ConflictSolveByHistory-2.png"/>
<div class="caption">
Interval Breaking</div></div>
</div>
</div>
<a id="a9c0fa6a9067b6e027e24f38330f627dc"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a9c0fa6a9067b6e027e24f38330f627dc">&#9670;&nbsp;</a></span>conflictSolveByPlaceds()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">bool conflictSolveByPlaceds </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p><b>Returns:</b> <b>true</b> if a suitable dogleg has been created in the segment <em>or</em> a dislodger has been moved up.</p>
<p>This methods achieve the same goal as <a class="el" href="classKite_1_1SegmentFsm.html#a0d9a9926ae67cc7998799347f135e28a">SegmentFsm::conflictSolveByHistory()</a> but uses a different strategy.</p>
<p>Instead of looking through the history to find dislodgers it analyses the placed segments in all the candidates tracks for the to be placed segment. Unlike it's sibling method, which creates only one dogleg, as it uses the <a class="el" href="classKite_1_1Manipulator.html#a8b5b69fd5762d5a0cbc4ceea4d1b68c1">Manipulator::relax()</a> method, it may creates up to two doglegs.</p>
<p><b>Synthetic Description</b></p>
<ol type="1">
<li>For each track, find the dislodgers, merge the overlaps into one interval and store the length of the longuest overlap (aka conflict).</li>
<li>Sort the tracks according to decreasing longuest overlap/confict.</li>
<li>For each track in the sorted list, look for a dislodger under the middle of the to be placed segment. If no dislodger is present at this place go to the next track. Otherwise:<ul>
<li><em>The dislodger is local</em>, then try to relax the to placed segment around the dislodger.</li>
<li><em>The dislodger is global</em>, try to move it up, if it is not possible, fallback to the relax approach.</li>
</ul>
</li>
<li>Quit on the first successful move up or relax.</li>
<li>If there is no candidate tracks, this means the vertical constraints are too tight, in that case, ripup the perpandiculars (fallback plan).</li>
</ol>
<p><b>Interval Accounting</b></p>
<p>Only global conflicting segments are took into account. Local segments may be took into account if they overlap global ones (all part of the same net). All overlapping segments are merged into one big conflict interval. The whole length of a conflict interval is took into account event if it's overlap with the to be placed segment is only partial.</p>
<p><b><a class="el" href="classKite_1_1Track.html" title="Structure managing one routing track. ">Track</a> Ordering (lexicographic)</b></p>
<ol type="1">
<li>The longuest (in one interval) conflict length.</li>
<li>The longuest cumulative conflict length (all interval summed up).</li>
</ol>
<p>Interval accounting and <a class="el" href="classKite_1_1Track.html" title="Structure managing one routing track. ">Track</a> ordering is managed through the undocumented <code>Cs1Candidate</code> class implemented in <code>SegmentFsm.cpp</code>.</p>
<div class="image">
<img src="ConflictSolveByPlaceds-1.png" alt="ConflictSolveByPlaceds-1.png"/>
<div class="caption">
Candidates Track Ordering</div></div>
</div>
</div>
<a id="a0b8e8be9d7c9501be9534d3c2a9dd586"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a0b8e8be9d7c9501be9534d3c2a9dd586">&#9670;&nbsp;</a></span>desaturate()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">bool desaturate </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Try to create a suitable empty space in a cost <a class="el" href="classKite_1_1Track.html" title="Structure managing one routing track. ">Track</a> by moving up <a class="el" href="classKite_1_1TrackElement.html" title="Abstract Class for all Elements inserted inside a Track. ">TrackElement</a> in conflict. </p>
</div>
</div>
<a id="a623d68f599c0de60cdd36af3f183e6f1"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a623d68f599c0de60cdd36af3f183e6f1">&#9670;&nbsp;</a></span>slackenTopology()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">bool slackenTopology </td>
<td>(</td>
<td class="paramtype">unsigned int&#160;</td>
<td class="paramname"><em>flags</em> = <code>0</code></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Modificate the topology of the <a class="el" href="classKite_1_1TrackElement.html" title="Abstract Class for all Elements inserted inside a Track. ">TrackElement</a> to slacken it. It is the implementation of the slakening finite state machine. </p>
</div>
</div>
<a id="ab8ae818baad1d0a274a7e8c308ca3f92"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ab8ae818baad1d0a274a7e8c308ca3f92">&#9670;&nbsp;</a></span>solveFullBlockages()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">bool solveFullBlockages </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Try to solve a fully blocked configuration. </p>
</div>
</div>
<hr/>The documentation for this class was generated from the following files:<ul>
<li><a class="el" href="SegmentFsm_8h_source.html">SegmentFsm.h</a></li>
<li>SegmentFsm.cpp</li>
<li>SegmentFsm.dox</li>
</ul>
</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>