<ahref="#pub-methods">Public Member Functions</a>|
<ahref="classKite_1_1SegmentFsm-members.html">List of all members</a></div>
<divclass="headertitle">
<divclass="title">SegmentFsm Class Reference</div></div>
</div><!--header-->
<divclass="contents">
<p>Pseudo-decorator to process a <aclass="el"href="classKite_1_1RoutingEvent.html"title="Atomic Placement Request for a TrackSegment. ">RoutingEvent</a>.
  <aclass="el"href="classKite_1_1SegmentFsm.html#a5d74787dedbc4e11c1ab15bf487e61f8a22374bab829fac7d12af4784d80eeb6e">OtherRipup</a> = Other | Ripup,
<trclass="memitem:a623d68f599c0de60cdd36af3f183e6f1"><tdclass="memItemLeft"align="right"valign="top">bool </td><tdclass="memItemRight"valign="bottom"><aclass="el"href="classKite_1_1SegmentFsm.html#a623d68f599c0de60cdd36af3f183e6f1">slackenTopology</a> (unsigned int flags=0)</td></tr>
<divclass="textblock"><p>Pseudo-decorator to process a <aclass="el"href="classKite_1_1RoutingEvent.html"title="Atomic Placement Request for a TrackSegment. ">RoutingEvent</a>. </p>
<p>The <aclass="el"href="classKite_1_1SegmentFsm.html"title="Pseudo-decorator to process a RoutingEvent. ">SegmentFsm</a> class actually perform the placement of the <aclass="el"href="classKite_1_1TrackElement.html"title="Abstract Class for all Elements inserted inside a Track. ">Kite::TrackElement</a> of the <aclass="el"href="classKite_1_1RoutingEvent.html"title="Atomic Placement Request for a TrackSegment. ">Kite::RoutingEvent</a>. It structured around three goals:</p>
<li>Implement the finite state machine for the <aclass="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 <aclass="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><aclass="anchor"id="secUpdate"></a>
Update Mechanism</h1>
<p>The constructor of <aclass="el"href="classKite_1_1SegmentFsm.html"title="Pseudo-decorator to process a RoutingEvent. ">SegmentFsm</a> triggers the update of the <aclass="el"href="classKite_1_1RoutingEvent.html"title="Atomic Placement Request for a TrackSegment. ">RoutingEvent</a> and through it <aclass="el"href="classKite_1_1DataNegociate.html"title="Algorimthmic datas associated the TrackSegment. ">DataNegociate</a>.</p>
<h1><aclass="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>
<li><aclass="el"href="classKite_1_1DataNegociate.html#ab7ccb6fc1f298728995250a3bbcf18c7a19d8d157762b2b73c5274e4865523d29">DataNegociate::RipupPerpandiculars</a> (<aclass="el"href="classKite_1_1Manipulator.html"title="Handle TrackElement ripup & topological modifications. ">Manipulator</a>) place the segments before any of it's perpandiculars are placed to allow a maximum track choice.</li>
<li><aclass="el"href="classKite_1_1DataNegociate.html#ab7ccb6fc1f298728995250a3bbcf18c7a548e204a4e2ffae50774910737f11380">DataNegociate::Minimize</a> (<aclass="el"href="classKite_1_1Manipulator.html"title="Handle TrackElement ripup & topological modifications. ">Manipulator</a>) try to fit the segment in a hole in a track, perform a hole detection.</li>
<li><aclass="el"href="classKite_1_1DataNegociate.html#ab7ccb6fc1f298728995250a3bbcf18c7a361bca46d5e7bdf02f50f7ecaa6018a9">DataNegociate::Dogleg</a> (<aclass="el"href="classKite_1_1Manipulator.html"title="Handle TrackElement ripup & topological modifications. ">Manipulator</a>) create a dogleg matching <em>the first track candidate</em> with a non-nul overlap.</li>
<li><aclass="el"href="classKite_1_1DataNegociate.html#ab7ccb6fc1f298728995250a3bbcf18c7a0d4bff02b3163821c0e5f7ad9dd55f36">DataNegociate::Slacken</a> (<aclass="el"href="classKite_1_1Manipulator.html"title="Handle TrackElement ripup & topological modifications. ">Manipulator</a>) <spanclass="red">to be reviewed.</span></li>
<li><aclass="el"href="classKite_1_1DataNegociate.html#ab7ccb6fc1f298728995250a3bbcf18c7ae08187cba35efd6229ab8acfd003a600">DataNegociate::ConflictSolveByHistory</a> (<aclass="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><aclass="el"href="classKite_1_1DataNegociate.html#ab7ccb6fc1f298728995250a3bbcf18c7afce071be0ba39626ed1c865789da598b">DataNegociate::ConflictSolveByPlaceds</a> (<aclass="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><aclass="el"href="classKite_1_1DataNegociate.html#ab7ccb6fc1f298728995250a3bbcf18c7adfd76a7d65b56ed7ecc0eedf921d6f82">DataNegociate::MoveUp</a> (<aclass="el"href="classKite_1_1Manipulator.html"title="Handle TrackElement ripup & topological modifications. ">Manipulator</a>) try to move up the segment.</li>
</ol>
<p>Simple slackening operations are defined in <aclass="el"href="classKite_1_1Manipulator.html"title="Handle TrackElement ripup & topological modifications. ">Manipulator</a> and complex ones directly in <aclass="el"href="classKite_1_1SegmentFsm.html"title="Pseudo-decorator to process a RoutingEvent. ">SegmentFsm</a>.</p>
<li><aclass="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><aclass="el"href="classKite_1_1SegmentFsm.html#a7140b507da2cab137d968a037bed19df">SegmentFsm::insertInTrack()</a> automates the three subsequent ripup trials. </li>
<p>Indicates what the <aclass="el"href="classKite_1_1SegmentFsm.html"title="Pseudo-decorator to process a RoutingEvent. ">SegmentFsm</a> has done the processed <aclass="el"href="classKite_1_1TrackElement.html"title="Abstract Class for all Elements inserted inside a Track. ">TrackElement</a>, possible values are:</p>
<li><aclass="el"href="classKite_1_1SegmentFsm.html#a5d74787dedbc4e11c1ab15bf487e61f8a79ae4f26b8ed9c55b81f981bb5076e1d">SegmentFsm::MissingData</a>, this is an error condition, the <aclass="el"href="classKite_1_1TrackElement.html"title="Abstract Class for all Elements inserted inside a Track. ">TrackElement</a> do not have associated <aclass="el"href="classKite_1_1DataNegociate.html"title="Algorimthmic datas associated the TrackSegment. ">DataNegociate</a> structure. Nothing is done.</li>
<li><aclass="el"href="classKite_1_1SegmentFsm.html#a5d74787dedbc4e11c1ab15bf487e61f8a13ac7e0722ca806ff25d8fa9220e980b">SegmentFsm::EmptyTrackList</a>, no <aclass="el"href="classKite_1_1Track.html"title="Structure managing one routing track. ">Track</a> is available for placement (free or used).</li>
<li><aclass="el"href="classKite_1_1SegmentFsm.html#a5d74787dedbc4e11c1ab15bf487e61f8a8c564779c81599aaadbe879fa2b08d92">SegmentFsm::SelfInserted</a>, the <aclass="el"href="classKite_1_1TrackElement.html"title="Abstract Class for all Elements inserted inside a Track. ">TrackElement</a> can be successfully inserted in a <aclass="el"href="classKite_1_1Track.html"title="Structure managing one routing track. ">Track</a> (i.e. without overlap).</li>
<li><aclass="el"href="classKite_1_1SegmentFsm.html#a5d74787dedbc4e11c1ab15bf487e61f8a560766bb79539564fdeda432c8efae6d">SegmentFsm::SelfMaximumSlack</a>, nothing can be done to further slacken the <aclass="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><aclass="el"href="classKite_1_1SegmentFsm.html#a5d74787dedbc4e11c1ab15bf487e61f8a22374bab829fac7d12af4784d80eeb6e">SegmentFsm::OtherRipup</a>, the <aclass="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>
<p><b>[Flag]</b>, the <aclass="el"href="classKite_1_1TrackElement.html"title="Abstract Class for all Elements inserted inside a Track. ">TrackElement</a> can be inserted in a <aclass="el"href="classKite_1_1Track.html"title="Structure managing one routing track. ">Track</a>. </p>
<p><b>[Flag]</b>, the action is related to the processed <aclass="el"href="classKite_1_1TrackSegment.html"title="Derived Katabatic::AutoSegment for the router. ">TrackSegment</a>. </p>
<p><b>[Flag]</b>, the action is <b>not</b> related to the processed <aclass="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>
<tr><tdclass="paramname">event</td><td>The <aclass="el"href="classKite_1_1RoutingEvent.html"title="Atomic Placement Request for a TrackSegment. ">RoutingEvent</a> to be processed. </td></tr>
<tr><tdclass="paramname">queue</td><td>The <aclass="el"href="classKite_1_1RoutingEvent.html"title="Atomic Placement Request for a TrackSegment. ">RoutingEvent</a> queue. </td></tr>
<tr><tdclass="paramname">history</td><td>The complete history of <aclass="el"href="classKite_1_1RoutingEvent.html"title="Atomic Placement Request for a TrackSegment. ">RoutingEvent</a>.</td></tr>
</table>
</dd>
</dl>
<p>Construct a <aclass="el"href="classKite_1_1SegmentFsm.html"title="Pseudo-decorator to process a RoutingEvent. ">SegmentFsm</a> from a <aclass="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>
<h2class="groupheader">Member Function Documentation</h2>
<p><b>Returns:</b> The currently processed <aclass="el"href="classKite_1_1RoutingEvent.html"title="Atomic Placement Request for a TrackSegment. ">RoutingEvent</a> (<em>cached</em>). </p>
<p>Referenced by <aclass="el"href="classKite_1_1SegmentFsm.html#abbcf429498049478d4d8ab94cdb4a022">SegmentFsm::doActions()</a>, <aclass="el"href="classKite_1_1SegmentFsm.html#a623d68f599c0de60cdd36af3f183e6f1">SegmentFsm::slackenTopology()</a>, and <aclass="el"href="classKite_1_1SegmentFsm.html#ab8ae818baad1d0a274a7e8c308ca3f92">SegmentFsm::solveFullBlockages()</a>.</p>
<p><b>Returns:</b> The <aclass="el"href="classKite_1_1RoutingEvent.html"title="Atomic Placement Request for a TrackSegment. ">RoutingEvent</a> queue (<em>cached</em>). </p>
<p><b>Returns:</b> The <aclass="el"href="classKite_1_1RoutingEvent.html"title="Atomic Placement Request for a TrackSegment. ">RoutingEvent</a> history (<em>cached</em>). </p>
<p><b>Returns:</b> The state (SegmentFsm::SegmentFsmValues) which the <aclass="el"href="classKite_1_1SegmentFsm.html"title="Pseudo-decorator to process a RoutingEvent. ">SegmentFsm</a> has computed for the <aclass="el"href="classKite_1_1RoutingEvent.html"title="Atomic Placement Request for a TrackSegment. ">RoutingEvent</a>. This is <b>not</b> the state of the <aclass="el"href="classKite_1_1DataNegociate.html"title="Algorimthmic datas associated the TrackSegment. ">DataNegociate</a></p>
<p><b>Returns:</b> The <aclass="el"href="classKite_1_1DataNegociate.html"title="Algorimthmic datas associated the TrackSegment. ">DataNegociate</a> of the <aclass="el"href="classKite_1_1TrackElement.html"title="Abstract Class for all Elements inserted inside a Track. ">TrackElement</a> (<em>cached</em>). </p>
<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>
<p>Referenced by <aclass="el"href="classKite_1_1SegmentFsm.html#a0b8e8be9d7c9501be9534d3c2a9dd586">SegmentFsm::desaturate()</a>, <aclass="el"href="classKite_1_1Manipulator.html#add26b688d75a99a1ae781787eead08d5">Manipulator::forceOverLocals()</a>, <aclass="el"href="classKite_1_1Manipulator.html#af4d93a43ea18ae124da71072c66d1e0a">Manipulator::makeDogleg()</a>, and <aclass="el"href="classKite_1_1Manipulator.html#aa61f08642d981761687635be108b9837">Manipulator::minimize()</a>.</p>
<p>Referenced by <aclass="el"href="classKite_1_1SegmentFsm.html#a0b8e8be9d7c9501be9534d3c2a9dd586">SegmentFsm::desaturate()</a>, <aclass="el"href="classKite_1_1Manipulator.html#add26b688d75a99a1ae781787eead08d5">Manipulator::forceOverLocals()</a>, <aclass="el"href="classKite_1_1Manipulator.html#a76d3956660cfa624696e2a5f2916cd22">Manipulator::forceToTrack()</a>, <aclass="el"href="classKite_1_1Manipulator.html#a7140b507da2cab137d968a037bed19df">Manipulator::insertInTrack()</a>, <aclass="el"href="classKite_1_1Manipulator.html#aa61f08642d981761687635be108b9837">Manipulator::minimize()</a>, and <aclass="el"href="classKite_1_1SegmentFsm.html#ab8ae818baad1d0a274a7e8c308ca3f92">SegmentFsm::solveFullBlockages()</a>.</p>
<p><b>Returns:</b> The <aclass="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>Referenced by <aclass="el"href="classKite_1_1SegmentFsm.html#a0b8e8be9d7c9501be9534d3c2a9dd586">SegmentFsm::desaturate()</a>, <aclass="el"href="classKite_1_1Manipulator.html#add26b688d75a99a1ae781787eead08d5">Manipulator::forceOverLocals()</a>, <aclass="el"href="classKite_1_1Manipulator.html#a76d3956660cfa624696e2a5f2916cd22">Manipulator::forceToTrack()</a>, <aclass="el"href="classKite_1_1Manipulator.html#a7140b507da2cab137d968a037bed19df">Manipulator::insertInTrack()</a>, <aclass="el"href="classKite_1_1Manipulator.html#af4d93a43ea18ae124da71072c66d1e0a">Manipulator::makeDogleg()</a>, <aclass="el"href="classKite_1_1Manipulator.html#aa61f08642d981761687635be108b9837">Manipulator::minimize()</a>, and <aclass="el"href="classKite_1_1Manipulator.html#aba69c61ccb330e26aaa8211f0454795f">Manipulator::shrinkToTrack()</a>.</p>
<p><b>Returns:</b> The overlapping <em>begin</em> index in <aclass="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>Referenced by <aclass="el"href="classKite_1_1SegmentFsm.html#a0b8e8be9d7c9501be9534d3c2a9dd586">SegmentFsm::desaturate()</a>, <aclass="el"href="classKite_1_1Manipulator.html#add26b688d75a99a1ae781787eead08d5">Manipulator::forceOverLocals()</a>, <aclass="el"href="classKite_1_1Manipulator.html#a76d3956660cfa624696e2a5f2916cd22">Manipulator::forceToTrack()</a>, <aclass="el"href="classKite_1_1Manipulator.html#a7140b507da2cab137d968a037bed19df">Manipulator::insertInTrack()</a>, <aclass="el"href="classKite_1_1Manipulator.html#af4d93a43ea18ae124da71072c66d1e0a">Manipulator::makeDogleg()</a>, <aclass="el"href="classKite_1_1Manipulator.html#aa61f08642d981761687635be108b9837">Manipulator::minimize()</a>, and <aclass="el"href="classKite_1_1Manipulator.html#aba69c61ccb330e26aaa8211f0454795f">Manipulator::shrinkToTrack()</a>.</p>
<p><b>Returns:</b> The overlapping <em>end</em> index in <aclass="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>Referenced by <aclass="el"href="classKite_1_1SegmentFsm.html#a0b8e8be9d7c9501be9534d3c2a9dd586">SegmentFsm::desaturate()</a>, <aclass="el"href="classKite_1_1Manipulator.html#add26b688d75a99a1ae781787eead08d5">Manipulator::forceOverLocals()</a>, <aclass="el"href="classKite_1_1Manipulator.html#a76d3956660cfa624696e2a5f2916cd22">Manipulator::forceToTrack()</a>, <aclass="el"href="classKite_1_1Manipulator.html#a7140b507da2cab137d968a037bed19df">Manipulator::insertInTrack()</a>, <aclass="el"href="classKite_1_1Manipulator.html#af4d93a43ea18ae124da71072c66d1e0a">Manipulator::makeDogleg()</a>, <aclass="el"href="classKite_1_1Manipulator.html#aa61f08642d981761687635be108b9837">Manipulator::minimize()</a>, and <aclass="el"href="classKite_1_1Manipulator.html#aba69c61ccb330e26aaa8211f0454795f">Manipulator::shrinkToTrack()</a>.</p>
<p><b>Returns:</b> The table of <aclass="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 <aclass="el"href="classKite_1_1RoutingEvent.html"title="Atomic Placement Request for a TrackSegment. ">RoutingEvent</a> creation. </p>
<p>Referenced by <aclass="el"href="classKite_1_1SegmentFsm.html#a0b8e8be9d7c9501be9534d3c2a9dd586">SegmentFsm::desaturate()</a>, <aclass="el"href="classKite_1_1Manipulator.html#add26b688d75a99a1ae781787eead08d5">Manipulator::forceOverLocals()</a>, <aclass="el"href="classKite_1_1Manipulator.html#a76d3956660cfa624696e2a5f2916cd22">Manipulator::forceToTrack()</a>, <aclass="el"href="classKite_1_1Manipulator.html#a7140b507da2cab137d968a037bed19df">Manipulator::insertInTrack()</a>, and <aclass="el"href="classKite_1_1Manipulator.html#aba69c61ccb330e26aaa8211f0454795f">Manipulator::shrinkToTrack()</a>.</p>
<p>Request the creation of a new delayed <aclass="el"href="classKite_1_1RoutingEvent.html"title="Atomic Placement Request for a TrackSegment. ">RoutingEvent</a>, for the meaning of the parameters, see <aclass="el"href="classKite_1_1SegmentAction.html#acbeca58f8327b69a540628f299d5bd35">SegmentAction::SegmentAction</a>. </p>
<p>Referenced by <aclass="el"href="classKite_1_1Manipulator.html#a7140b507da2cab137d968a037bed19df">Manipulator::insertInTrack()</a>, and <aclass="el"href="classKite_1_1SegmentFsm.html#a623d68f599c0de60cdd36af3f183e6f1">SegmentFsm::slackenTopology()</a>.</p>
<p>Try to insert the <aclass="el"href="classKite_1_1TrackElement.html"title="Abstract Class for all Elements inserted inside a Track. ">TrackElement</a> in the <aclass="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>
<li><aclass="el"href="classKite_1_1Manipulator.html#a7140b507da2cab137d968a037bed19df">Manipulator::insertInTrack()</a>, try to push asides the neighbors.</li>
<li><aclass="el"href="classKite_1_1Manipulator.html#aba69c61ccb330e26aaa8211f0454795f">Manipulator::shrinkToTrack()</a>, try squeeze the segment in an existing free space.</li>
<li><aclass="el"href="classKite_1_1Manipulator.html#a76d3956660cfa624696e2a5f2916cd22">Manipulator::forceToTrack()</a>, perform a complete ripup of all the neighbors and their perpandiculars.</li>
<p>The event keeps track of the insertion attempt step (see <aclass="el"href="classKite_1_1RoutingEvent.html#ae3c7f769774daa40e1678637037b502c">RoutingEvent::getInsertState()</a>). </p>
<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>
<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><spanclass="red">For the time beeing we only look on the track into which</span><spanclass="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>
<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 <aclass="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 <aclass="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>
<oltype="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><aclass="el"href="classKite_1_1Track.html"title="Structure managing one routing track. ">Track</a> Ordering (lexicographic)</b></p>
<oltype="1">
<li>The longuest (in one interval) conflict length.</li>
<p>Interval accounting and <aclass="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>
<p>Try to create a suitable empty space in a cost <aclass="el"href="classKite_1_1Track.html"title="Structure managing one routing track. ">Track</a> by moving up <aclass="el"href="classKite_1_1TrackElement.html"title="Abstract Class for all Elements inserted inside a Track. ">TrackElement</a> in conflict. </p>
<p>Modificate the topology of the <aclass="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>