coriolis/hurricane/doc/analog/html/index.html

107 lines
6.5 KiB
HTML
Raw Normal View History

<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.0//EN'>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>Hurricane Documentation</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">Hurricane VLSI Database</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><!-- top -->
<div class="header">
<div class="headertitle">
<div class="title">Hurricane Analog Documentation</div> </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><h1><a class="anchor" id="secMainDoc"></a>
Software Architecture</h1>
<h2><a class="anchor" id="ssecUniqueInstance"></a>
Unique Instance-Cell Relationship</h2>
<p>MetaTransistor and Device are derived classes of Cell and are the building blocks of all analogic designs.</p><ul>
<li>MetaTransistor(s) are used to build the Devices, and <em>only</em> them.</li>
<li>Device(s) are then assembled into more complex design.</li>
</ul>
<p>The important point to remember is that Device and MetaTransistor <b>are</b> Cell(s).</p>
<dl class="section note"><dt>Note</dt><dd>An analogy can be made between the Devices and the Standard Cells in the numeric world.</dd></dl>
<p>In Analog designs, Devices and MetaTransistors are all parametriseds in such a way that each one become effectively unique. So any Device or MetaTransistor is only instanciated once with it's specific set of parameter's values, thus there is a <b>unique</b> relationship between a Device and it's instance. We can keep tab of only one of the two. As the Cell contains more information, this is the one we choose. But we still need the Instance to perform (store) the placement informations. So, how to get the Instance from one Device.</p>
<p><b>Method 1:</b> name matching.</p>
<p>For the sake of clarity, we impose that the Device name must be identical to the instance name. This way we can lookup for an Instance in the top device with the same name as the current model. We assume that we indeed have the containing Cell in handy:</p>
<div class="fragment"><div class="line">Instance* instance = parentCell-&gt;getInstance( cell-&gt;getName() );</div></div><!-- fragment --><p><b>Method 2:</b> Slave instance.</p>
<p>In the Hurricane data structure, every Device (Cell) keep track of the Instances pointing to it. Since there should be only one in analogic, we can do the following:</p>
<div class="fragment"><div class="line">Instance* instance = cell-&gt;getSlaveInstances().getFirst();</div></div><!-- fragment --><h2><a class="anchor" id="ssecWhyMetaTrans"></a>
Why Meta-Transistor</h2>
<p>The Hurricane database does not have true support for transistor as Cell(s), only a dedicated layer for Segment. Hence the implementation of the MetaTransistor in Hurricane/Analog. It provides a Cell derived class with four connectors (<code>G</code> , <code>S</code> , <code>D</code> , <code>B</code> ) and a comprenhensive set of electrical parameters.</p>
<p>It is meant to represent a complete transistor, not a finger of a larger one, it <b>is</b> the larger one...</p>
<h2><a class="anchor" id="ssecClassOrg"></a>
Class Organization</h2>
<p>Almost UML schema of the Device related classes.</p>
<div class="image">
<img src="device_schema_1_uml.png" alt="device_schema_1_uml.png"/>
</div>
<p>For the Transistor device:</p>
<ol type="1">
<li>The netlist is fixed and generated (in C++) in the Transistor, by instanciating one MetaTransistor.</li>
<li>The layout is generated <em>on the fly</em> by calling the relevant python script.</li>
<li>The parameters, which are commons to all the Transistor based devices are created in TransistorFamily. The parameters are created through the Device parameter factory and stored at the Device level. A pointer to the concrete type of Parameter is also kept at the TransistorFamily level.</li>
<li>The Device::getParameters() method is implemented at this level and returns a reference to the set of parameters.</li>
<li><p class="startli">Parameters are used to set up the Device characteristics, either programmatically or through the graphical interface.</p>
<p class="startli">The layout Python generation scripts also uses the Parameter to know the settings of a device.</p>
</li>
</ol>
<p>Deprecateds:</p>
<ol type="1">
<li><p class="startli"><code>Arguments</code> where fully redundant with Parameters, so we did remove them.</p>
<p class="startli"><b>The Arguments must be removed from the UML schema.</b></p>
</li>
</ol>
<h2><a class="anchor" id="ssecOpenQuestions"></a>
Open questions</h2>
<ol type="1">
<li>In Bora::channelRouting, what is implemented is in fact an interval tree (or segment tree). We should try to use their <code>Boost</code> implementation.</li>
<li>In Bora::SlicingTree, whe should merge the list of user nodes (devices and hierarchical) with the routing nodes (channels and struts) to unify the underlying management. This sould enable us to move lots method implementation <em>upward</em> in the class hierarchy. </li>
</ol>
</div></div><!-- contents -->
<br>
<hr>
<table class="footer1">
<tr>
Migrating the initialisation system to be completely Python-like. * New: In bootstrap/coriolisEnv.py, add the "etc" directory to the PYTHONPATH as initialization are now Python modules. * New: In Hurricane/analogic, first groundwork for the integration of PIP/MIM/MOM multi-capacitors. Add C++ and Python interface for the allocation matrix and the list of capacities values. * Change: In Hurricane::RegularLayer, add a layer parameter to the constructor so the association between the RegularLayer and it's BasicLayer can readily be done. * Change: In Hurricane::Layer, add a new getCut() accessor to get the cut layer in ViaLayer. * Change: In Hurricane::DataBase::get(), the Python wrapper should no longer consider an error if the data-base has not been created yet. Just return None. * Bug: In Isobar::PyLayer::getEnclosure() wrapper, if the overall enclosure is requested, pass the right parameter to the C++ function. * Change: In AllianceFramework, make public _bindLibraries() and export it to the Python interface. * Change: In AllianceFramework::create(), do not longer call bindLibraries(). This now must be done explicitely and afterwards. * Change: In AllianceFramework::createLibrary() and Environement::addSYSTEM_LIBRARY(), minor bug corrections that I don't recall. * Change: In SearchPath::prepend(), set the selected index to zero and return it. * Change: In CRL::System CTOR, add "etc" to the PYTHONPATH as the configuration files are now organized as Python modules. * New: In PyCRL, export the CRL::System singleton, it's creation is no longer triggered by the one of AllianceFramework. * New: In CRL/etc/, convert most of the configuration files into the Python module format. For now, keep the old ".conf", but that are no longer used. For the real technologies, we cannot keep the directory name as "180" or "45" as it not allowed by Python syntax, so we create "node180" or "node45" instead. Most of the helpers and coriolisInit.py are no longer used now. To be removed in future commits after being sure that everything works... * Bug: In AutoSegment::makeDogleg(AutoContact*), the layer of the contacts where badly computed when one end of the original segment was attached to a non-preferred direction segment (mostly on terminal contacts). Now use the new AutoContact::updateLayer() method. * Bug: In Dijkstra::load(), limit symetric search area only if the net is a symmetric one ! * Change: In Katana/python/katanaInit.py, comply with the new initialisation scheme. * Change: In Unicorn/cgt.py, comply to the new inititalization scheme. * Change: In cumulus various Python scripts remove the call to helpers.staticInitialization() as they are not needed now (we run in only *one* interpreter, so we correctly share all init). In plugins/__init__.py, read the new NDA directory variable. * Bug: In cumulus/plugins/Chip.doCoronafloorplan(), self.railsNb was not correctly managed when there was no clock. * Change: In cumulus/plugins/Configuration.coronaContactArray(), compute the viaPitch from the technology instead of the hard-coded 4.0 lambdas. In Configuration.loadConfiguration(), read the "ioring.py" from the new user's settings module. * Bug: In stratus.dpgen_ADSB2F, gives coordinates translated into DbU to the XY functions. In st_model.Save(), use the VstUseConcat flag to get correct VST files. In st_net.hur_net(), when a net is POWER/GROUND or CLOCK also make it global. * Change: In Oroshi/python/WIP_Transistor.py, encapsulate the generator inside a try/except block to get prettier error (and stop at the first).
2019-10-28 12:09:14 -05:00
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Oct 28 2019</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">Hurricane VLSI Database</td>
<td class="RFooter"><small>Copyright &#169; 2000-2016 Bull S.A. All rights reserved</small></td>
</tr>
</table>
</body>
</html>