coriolis/kite/doc/html/pageNotes.html

166 lines
18 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.5 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li class="current"><a href="pages.html"><span>Related&#160;Pages</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="namespaces.html"><span>Namespaces</span></a></li>
<li><a href="annotated.html"><span>Classes</span></a></li>
<li><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle">
<div class="title">Notes </div> </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><h1><a class="anchor" id="Summary"></a>
Summary</h1>
<ul>
<li><a class="el" href="pageNotes.html#ssecVariousNotes">Various Things to Remeber</a></li>
<li><a class="el" href="pageNotes.html#secPendingModifications">Pending Modifications</a></li>
<li><a class="el" href="pageNotes.html#secModificationsHistory">Modifications History</a></li>
<li><a class="el" href="pageNotes.html#ssecArchitectureChanges">Changes in the general architecture</a><ul>
<li><a class="el" href="pageNotes.html#ssecModificationsKiteEngine">Changes in KiteEngine class design</a></li>
<li><a class="el" href="pageNotes.html#ssecModificationsDataNegociate">Changes in DataNegociate class design</a></li>
<li><a class="el" href="pageNotes.html#ssecModificationsTrackElement">Changes in TrackElement class design</a></li>
<li><a class="el" href="pageNotes.html#ssecModificationsTrackSegment">Changes in TrackSegment class design</a></li>
<li><a class="el" href="pageNotes.html#ssecModificationsAutoSegment">Changes in AutoSegment class design</a></li>
<li><a class="el" href="pageNotes.html#ssecModificationsAutoContact">Changes in AutoContact class design</a></li>
</ul>
</li>
<li><a class="el" href="pageNotes.html#ssecBugBusting">Bug Solving Memento</a></li>
<li><a class="el" href="pageNotes.html#ssecNanoRoute">Evaluation with Cadence NanoRoute</a></li>
</ul>
<h1><a class="anchor" id="ssecVariousNotes"></a>
Various Things to Remember</h1>
<ul>
<li><b>Determinism checking.</b> The trace level to get only determinism related log is <code>500</code>. Each line for the determinism is prepended with 'Deter|', possible with some leading spaces.</li>
<li>The router only sees/manages the aligned segment sets (through a pseudo- decorator on their canonical segment). So the non-canonical segments and the contacts should not be handled at all at this level.</li>
<li>Do do confuse the Session::Event, events that modificate the state of the <a class="el" href="namespaceKite.html" title="The namespace dedicated to Kite. ">Kite</a> database (insert, move or remove <a class="el" href="classKite_1_1TrackSegment.html" title="Derived Katabatic::AutoSegment for the router. ">TrackSegment</a> in <a class="el" href="classKite_1_1Track.html" title="Structure managing one routing track. ">Track</a>) and the <a class="el" href="classKite_1_1RoutingEvent.html" title="Atomic Placement Request for a TrackSegment. ">RoutingEvent</a> class which request that a segment must be processed.</li>
<li>In the various processing method of <a class="el" href="classKite_1_1RoutingEvent.html" title="Atomic Placement Request for a TrackSegment. ">RoutingEvent</a>, when a <a class="el" href="classKite_1_1TrackSegment.html" title="Derived Katabatic::AutoSegment for the router. ">TrackSegment</a> can be inserted inside a <a class="el" href="classKite_1_1Track.html" title="Structure managing one routing track. ">Track</a> a Session::Event is generated but no further <a class="el" href="classKite_1_1RoutingEvent.html" title="Atomic Placement Request for a TrackSegment. ">RoutingEvent</a>, this end the placement processus of segment (until it is ripped-up).</li>
<li>AutoSegment do not invalidate their S/T anchor contacts.</li>
<li>AutoContact invalidate their anchored upon AutoSegment.</li>
<li>Now that the <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/namespaceHurricane.html">Hurricane</a> database is deterministic, the router seems to be likewise.</li>
<li><b>Reduce/raise mechanism</b>. To manage <em>same layer</em> dogleg this mechanism has been implemented. When a candidate dogleg perpandicular segment length shrink below one pitch it is removed from any track to become <em>invisible</em>. Conversely, when a reduced segment length expand over one pitch generate a new <a class="el" href="classKite_1_1RoutingEvent.html" title="Atomic Placement Request for a TrackSegment. ">RoutingEvent</a> to insert it. All this is managed in the <a class="el" href="classKite_1_1Session.html#a5bd93abe1416952ace15a98dbeeed124">Session::revalidate()</a> method.</li>
</ul>
<h1><a class="anchor" id="secPendingModifications"></a>
Pending Modifications</h1>
<ul>
<li>In <a class="el" href="classKite_1_1SegmentAction.html#a324f17f0f5a09b76344eb2e003695d74">SegmentAction::doAction()</a>, completly disable the movement of <a class="el" href="classKite_1_1TrackSegment.html" title="Derived Katabatic::AutoSegment for the router. ">TrackSegment</a> on it's target <a class="el" href="classKite_1_1Track.html" title="Structure managing one routing track. ">Track</a> axis. This should not be needed as, if the algorithm as worked correctly, the next time it's <a class="el" href="classKite_1_1RoutingEvent.html" title="Atomic Placement Request for a TrackSegment. ">RoutingEvent</a> is processed, the target <a class="el" href="classKite_1_1Track.html" title="Structure managing one routing track. ">Track</a> will have a free space to insert into. Then the <a class="el" href="classKite_1_1Track.html" title="Structure managing one routing track. ">Track</a> insertion will set the <a class="el" href="classKite_1_1TrackSegment.html" title="Derived Katabatic::AutoSegment for the router. ">TrackSegment</a> axis.</li>
<li>Has to complete the lazy evaluation of the <a class="el" href="classKite_1_1TrackSegment.html" title="Derived Katabatic::AutoSegment for the router. ">TrackSegment</a> / <a class="el" href="classKite_1_1DataNegociate.html" title="Algorimthmic datas associated the TrackSegment. ">DataNegociate</a> / <a class="el" href="classKite_1_1RoutingEvent.html" title="Atomic Placement Request for a TrackSegment. ">RoutingEvent</a>. There is still some redundancy when the key of the <a class="el" href="classKite_1_1RoutingEvent.html" title="Atomic Placement Request for a TrackSegment. ">RoutingEvent</a> is updated.</li>
<li>In <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/katabatic/doc/html/katabatic.tag:../katabatic/" href="../katabatic/classKatabatic_1_1AutoContact.html#a690764ddc997fe9766a79c4b8e0c3e2f">AutoContact::updateTopology()</a> &amp; <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/katabatic/doc/html/katabatic.tag:../katabatic/" href="../katabatic/classKatabatic_1_1AutoContact.html#af6a2454547eeb7f5a519970dcb467e90">AutoContact::updateGeometry()</a> we could avoid to systematically run through the Hooks to cache the connected segments. This can be done once at the first call of either method (whichever comes first) on the first revalidate. Afterwards the cache can be updated only by <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/katabatic/doc/html/katabatic.tag:../katabatic/" href="../katabatic/classKatabatic_1_1AutoContact.html#a690764ddc997fe9766a79c4b8e0c3e2f">AutoContact::updateTopology()</a>.</li>
<li>The canonization is done in two places, directly on a set of aligneds AutoSegments through <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/katabatic/doc/html/katabatic.tag:../katabatic/" href="../katabatic/classKatabatic_1_1AutoSegment.html#a8b0d5044dce091d06b633848a6f8a66d">AutoSegment::canonize()</a> and for the whole net Session::_canonize(), which is called after the initial creation and each time the topology is modificated. The later may be suppressed if we uses more intelligently the former, and gain some more speedup.</li>
</ul>
<h1><a class="anchor" id="secModificationsHistory"></a>
Modifications History</h1>
<h2><a class="anchor" id="ssecArchitectureChanges"></a>
Changes in the general architecture</h2>
<ul>
<li><b>Lazy Update.</b> Update of <a class="el" href="classKite_1_1DataNegociate.html" title="Algorimthmic datas associated the TrackSegment. ">DataNegociate</a> and <a class="el" href="classKite_1_1RoutingEvent.html" title="Atomic Placement Request for a TrackSegment. ">RoutingEvent</a> are now delayed until the event is processed, and systematically done at this point. Thus, the explicit invalidation of those objects is no longer needed. The revalidation is no longer triggered by the revalidation of <a class="el" href="classKite_1_1TrackSegment.html" title="Derived Katabatic::AutoSegment for the router. ">TrackSegment</a>.</li>
</ul>
<h2><a class="anchor" id="ssecModificationsKiteEngine"></a>
Changes in KiteEngine class design</h2>
<ul>
<li>Suppress the lookup table of <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/classHurricane_1_1Segment.html">Hurricane::Segment</a> toward <a class="el" href="classKite_1_1TrackSegment.html" title="Derived Katabatic::AutoSegment for the router. ">TrackSegment</a>. Instead uses the Observer mecanism between <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/katabatic/doc/html/katabatic.tag:../katabatic/" href="../katabatic/classKatabatic_1_1AutoSegment.html">Katabatic::AutoSegment</a> and <a class="el" href="classKite_1_1TrackSegment.html" title="Derived Katabatic::AutoSegment for the router. ">TrackSegment</a>.</li>
</ul>
<h2><a class="anchor" id="ssecModificationsDataNegociate"></a>
Changes in DataNegociate class design</h2>
<ul>
<li>Merge in the separate class <code>Cost</code>.</li>
<li>Suppress the <code>SlackState::Desalignate</code>, due to the simplificated structure of the AutoSegment/AutoContacts (no more collapseds, or forced alignements).</li>
<li>Displace the computation and caching of the perpandiculars and perpandicular free interval from <a class="el" href="classKite_1_1RoutingEvent.html" title="Atomic Placement Request for a TrackSegment. ">RoutingEvent</a> into <a class="el" href="classKite_1_1DataNegociate.html" title="Algorimthmic datas associated the TrackSegment. ">DataNegociate</a>. Allows code factorization with the attractors computation, and data size reduction as there is exaclty one <a class="el" href="classKite_1_1DataNegociate.html" title="Algorimthmic datas associated the TrackSegment. ">DataNegociate</a> but there may be more than one <a class="el" href="classKite_1_1RoutingEvent.html" title="Atomic Placement Request for a TrackSegment. ">RoutingEvent</a> for the same <a class="el" href="classKite_1_1TrackSegment.html" title="Derived Katabatic::AutoSegment for the router. ">TrackSegment</a>.</li>
</ul>
<h2><a class="anchor" id="ssecModificationsTrackElement"></a>
Changes in TrackElement class design</h2>
<ul>
<li>Due to the simplificated structure of the <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/katabatic/doc/html/katabatic.tag:../katabatic/" href="../katabatic/namespaceKatabatic.html">Katabatic</a> contacts (terminal, turn, vtee &amp; htee), there's no longer collapsed AutoSegment or <em>expandable</em> contacts. The <b>desalignate</b> feature, relaxing constraints due to collapsed segments or contacts with more than three segments, is no longer implemented. <b><span class="red">Have to redevelop a method to break long segments linked</span></b> <b><span class="red">by HTee or VTee.</span></b></li>
</ul>
<h2><a class="anchor" id="ssecModificationsTrackSegment"></a>
Changes in TrackSegment class design</h2>
<ul>
<li>The method <code>TrackSegment::_postModify()</code> is merged with <a class="el" href="classKite_1_1TrackSegment.html#a10a45c049d0bd7d01c7eff1c5441c7a2">TrackSegment::_postDoglegs()</a> as, in the context of <a class="el" href="classKite_1_1TrackSegment.html" title="Derived Katabatic::AutoSegment for the router. ">TrackSegment</a> the only used topological modifications goes through the creation of one or more dogleg.</li>
</ul>
<h2><a class="anchor" id="ssecModificationsAutoSegment"></a>
Changes in AutoSegment class design</h2>
<ul>
<li>In <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/katabatic/doc/html/katabatic.tag:../katabatic/" href="../katabatic/classKatabatic_1_1AutoSegment.html#a37a14b40295ccb50cd5001891385807b">AutoSegment::_makeDogleg()</a>, update the local/global status of the involved AutoSegment and re-canonize only what is necessary. Thus, guarantee that the net's topology is still valid after this method call and no topological update is needed at <a class="el" href="classKite_1_1Session.html" title="Kite update Session. ">Session</a> level (should be <em>much</em> faster). In this method, the code sharing between AutoHorizontal and AutoVertical can still be increased (update mechanisms are identicals).</li>
<li>The <code>id</code> support is now also implemented at <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/html/hurricane.tag:../hurricane/" href="../hurricane/namespaceHurricane.html">Hurricane</a> level. We may choose to use as a replacement of the one already present in AutoSegment. But in that case, we at least must cache the id in the AutoSegment. So we will not gain in memory footprint, the only benefit would be to have coherent id number throughout all the tools, but the sequentiality will be lost (this may not be a big issue).</li>
</ul>
<h2><a class="anchor" id="ssecModificationsAutoContact"></a>
Changes in AutoContact class design</h2>
<ul>
<li>In <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/katabatic/doc/html/katabatic.tag:../katabatic/" href="../katabatic/classKatabatic_1_1AutoSegment.html#a23599eee5a07af377fbc8d47cda7e7b0">AutoSegment::invalidate()</a>, no longer uses collection to walk through attached AutoSegment, directly uses the cache. Much simple and efficient as we exactly know what is attached on every kind of contact.</li>
</ul>
<h1><a class="anchor" id="ssecBugBusting"></a>
Bug Solving Memento</h1>
<p><b>LUT lookup change:</b> When breaking a <a class="el" href="classKite_1_1TrackSegment.html" title="Derived Katabatic::AutoSegment for the router. ">TrackSegment</a>, the break may not occurs in the associated canonical AutoSegment. In that case the <code>dogleg[O]</code> will not match the one that is looked up for the broken (canonical) segment. Thus it was not a bug but a misunderstanding...</p>
<p><b>Overlap of perpandiculars after a dogleg creation:</b> The axis of the new parallel was not set to the axis of it's parent. This was due to the uses of <a class="elRef" doxygen="/dsk/l1/jpc/coriolis-2.x/src/coriolis/katabatic/doc/html/katabatic.tag:../katabatic/" href="../katabatic/classKatabatic_1_1AutoSegment.html#a3881efebb7510d9b22e5f89bcd418954">AutoSegment::setAxis()</a> in AutoHorizontal::_makeDogleg() which silently do nothing on non-canonical AutoSegment, and at this point, the re-canonisation did not yet take place. Now Uses AutoSegment::_setAxis() the atomic variant wich works inconditionnaly.</p>
<h1><a class="anchor" id="ssecNanoRoute"></a>
Evaluation with Cadence NanoRoute</h1>
<p>To perform a comparison with NanoRoute the procedure is as follow:</p>
<ul>
<li>Export the design in Alliance <code>DEF</code> format. It will generate both <code>DEF</code> file and the supporting <code>LEF</code> file containing the technology and the abstract of all the standard cell of the design. As Alliance uses symbolic units (lambda), they are translated with the simple rule: <b>1 lambda == 1 micron</b>.</li>
<li>Run the commands in NanoRoute:<ul>
<li><code>loadLefFile design.lef</code></li>
<li><code>loadDefFile design.def</code></li>
<li><code>generateTracks</code></li>
<li><code>generateVias</code></li>
<li><code>setNanoRouteMode -quiet -drouteFixAntenna 0</code></li>
<li><code>setNanoRouteMode -quiet -drouteStartIteration default</code></li>
<li><code>setNanoRouteMode -quiet -routeTopRoutingLayer default</code></li>
<li><code>setNanoRouteMode -quiet -routeBottomRoutingLayer 2</code></li>
<li><code>setNanoRouteMode -quiet -drouteEndIteration default</code></li>
<li><code>setNanoRouteMode -quiet -routeWithTimingDriven false</code></li>
<li><code>setNanoRouteMode -quiet -routeWithSiDriven false</code></li>
<li><code>routeDesign -globalDetail</code></li>
</ul>
</li>
<li>To perform as fair a comparison as possible, those commands disable antenna effect protection and disable the use of the <code>M1</code> as a routing layer (<code>-routeBottomRoutingLayer 2</code>). Those commands are issued through the graphical interface of NanoRoute.</li>
</ul>
<p><em>To see the resulting layout, do not forget to switch the view mode.</em> </p>
</div></div><!-- contents -->
<br>
<hr>
<table class="footer1">
<tr>
<td class="LFooter"><small>Generated by doxygen 1.8.5 on Mon Oct 1 2018</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-2016 UPMC. All rights reserved</small></td>
</tr>
</table>
</body>
</html>